Spring中JavaBean的预处理和后处理

首先要知道在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 }

结果:

原文地址:https://www.cnblogs.com/doublesong/p/2632211.html