首先要知道在Spring中BeanFactory
在BeanFactory中JavaBean的生命周期分为实例化、初始化、使用和销毁四个阶段
实例化:调用BeanFactory的getBean()方法,在中期会创建JavaBean的实例对象,并根据指定的XML自动收集JavaBean的定义信息,通过<constructor-arg>标签为JavaBean构造方法阐述初始化JavaBean的实例对象
初始化:容器按照JavaBean的定义初始化JavaBean的所有属性和依赖关系。
使用:可直接通过getBean()方法获得并使用JavaBean的实例对象。
销毁:关闭容器时会销毁所有的javabean
JavaBean的预处理和后处理。通过实现BeanPostProcessor接口来对JavaBean是初始化之前调用还是初始化之后调用
例如:在本例子中定义了一个TempWorker类记录员工信息。LogFile中存储所有员工信息保存在workList中。在applicationContext.xml中在workList加入了3个worker。其中worker1赋值完整。如果不创建BeanPostProcessorExample运行之后未赋值的值为空。创建了BeanPostProcessorExample之后可以在logFile这个bean实例化之后根据我们的代码把为赋值的地方赋值
TempWorker:
1 package com; 2 3 public class TempWorker implements Worker{ 4 private String name; 5 private String workType; 6 private int pay; 7 8 public String getName() { 9 return name; 10 } 11 12 public void setName(String name) { 13 this.name = name; 14 } 15 16 public String getWorkType() { 17 return workType; 18 } 19 20 public void setWorkType(String workType) { 21 this.workType = workType; 22 } 23 24 25 26 27 public int getPay() { 28 return pay; 29 } 30 31 public void setPay(int pay) { 32 this.pay = pay; 33 } 34 35 public void printInfo() { 36 System.out.println("\nName:"+name); 37 System.out.println("Work Type:"+workType); 38 System.out.println("Pay:"+pay); 39 40 41 } 42 43 }
logFile:
1 package com; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class logFile { 7 private List workList=new ArrayList(); 8 9 public List getWorkList() { 10 return workList; 11 } 12 13 public void setWorkList(List workList) { 14 this.workList = workList; 15 } 16 17 }
applicationContext:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 3 "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> 4 <beans> 5 <bean id="log" class="com.logFile"> 6 <property name="workList"> 7 <list> 8 <ref bean="worker1"/> 9 <ref bean="worker2"/> 10 <ref bean="worker3"/> 11 </list> 12 </property> 13 </bean> 14 <bean id="worker1" class="com.TempWorker"> 15 <property name="name"> 16 <value>Michle</value> 17 </property> 18 <property name="pay"> 19 <value>1000</value> 20 </property> 21 22 </bean> 23 <bean id="worker2" class="com.TempWorker"> 24 <property name="name"> 25 <value>Michle</value> 26 </property> 27 <property name="workType"> 28 <value>Regular</value> 29 </property> 30 <property name="pay"> 31 <value>8000</value> 32 </property> 33 34 </bean> 35 <bean id="worker3" class="com.TempWorker"> 36 <property name="name"> 37 <value>Lucy</value> 38 </property> 39 40 41 </bean> 42 43 </beans>
test:
1 package com; 2 import java.util.Iterator; 3 import java.util.List; 4 5 import org.springframework.beans.factory.xml.XmlBeanFactory; 6 import org.springframework.context.ApplicationContext; 7 import org.springframework.context.support.ClassPathXmlApplicationContext; 8 import org.springframework.context.support.FileSystemXmlApplicationContext; 9 import org.springframework.core.io.ClassPathResource; 10 import org.springframework.core.io.Resource; 11 12 import com.Worker; 13 import com.logFile; 14 15 16 public class test { 17 public static void main(String args[]){ 18 ApplicationContext ctx=new FileSystemXmlApplicationContext("src/applicationContext.xml"); 19 //XmlBeanFactory bf=new XmlBeanFactory(rs); 20 logFile log=(logFile) ctx.getBean("log"); 21 List workerlist=log.getWorkList(); 22 System.out.println("All workers:"); 23 Iterator it=workerlist.iterator(); 24 while(it.hasNext()){ 25 Worker worker=(Worker) it.next(); 26 worker.printInfo(); 27 } 28 29 } 30 }
Result:
加入BeanPostProcessorExample
1 package com; 2 3 import org.springframework.beans.BeansException; 4 import org.springframework.beans.factory.config.BeanPostProcessor; 5 6 public class BeanPostProcessorExample implements BeanPostProcessor{ 7 8 public Object postProcessAfterInitialization(Object bean, String beanName) 9 throws BeansException { 10 if(bean instanceof TempWorker){ 11 TempWorker tempworker=(TempWorker) bean; 12 if(tempworker.getPay()<=800){ 13 tempworker.setPay(800); 14 } 15 if(tempworker.getWorkType()==null||tempworker.getWorkType().equals("")){ 16 tempworker.setWorkType("Temp"); 17 } 18 return tempworker; 19 } 20 return bean; 21 } 22 23 public Object postProcessBeforeInitialization(Object bean, String beanName) 24 throws BeansException { 25 // TODO Auto-generated method stub 26 return bean; 27 } 28 29 }
test:
1 package com; 2 3 import java.util.Iterator; 4 import java.util.List; 5 6 import org.springframework.beans.factory.config.BeanPostProcessor; 7 import org.springframework.beans.factory.xml.XmlBeanFactory; 8 import org.springframework.context.ApplicationContext; 9 import org.springframework.context.support.ClassPathXmlApplicationContext; 10 import org.springframework.context.support.FileSystemXmlApplicationContext; 11 import org.springframework.core.io.ClassPathResource; 12 import org.springframework.core.io.Resource; 13 14 public class TakeIn { 15 public static void main(String args[]){ 16 Resource rs = new ClassPathResource("applicationContext.xml"); 17 XmlBeanFactory bf = new XmlBeanFactory(rs); 18 BeanPostProcessorExample bp=new BeanPostProcessorExample(); 19 bf.addBeanPostProcessor(bp); 20 logFile log=(logFile) bf.getBean("log"); 21 List workerlist=log.getWorkList(); 22 System.out.println("All workers:"); 23 Iterator it=workerlist.iterator(); 24 while(it.hasNext()){ 25 Worker worker=(Worker) it.next(); 26 worker.printInfo(); 27 } 28 } 29 }
结果: