之前说过,在调用下面时,就创建了容器和对象

1    ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");

那它又是怎样一步步创建的呢?要销毁怎么销毁?

用一个例子来看

 1 package com.guigu.spring.Car;
 2 
 3 public class Car {
 4     private String brand;
 5     
 6     public Car(){
 7         System.out.println("构造函数。。");
 8     }
 9     public String getBrand() {
10         System.out.println("返回属性。。");
11         return brand;
12     }
13     public void setBrand(String brand) {
14         this.brand = brand;
15         System.out.println("设置属性。。");
16     }
17     public void init(){
18         System.out.println("init()。。");
19     }
20     public void destroy(){
21         System.out.println("destroy()。。");
22     }
23 }

 xml中用init-mehod、 destroy-method表示调用初始化函数和销毁函数

1 <bean id="car" class="com.guigu.spring.Car" init-method="init" destroy-method="destroy">
2 <property name="brand" value="Aodi"></property>
3 </bean>

 

main中

1   ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
2   Car car=(Car)ctx.getBean("car");
3   System.out.println(car);
4    //关闭IOC容器
5   ctx.close();

 

输出:

  构造函数。。
  设置属性。。
  init()。。
  car[brand=Aodi]
  destroy()。。

 

 

可以看出来,先调用构造函数和设置属性,然后再init()。

 

 bean后置处理器:检查bean属性的正确性或根据需要修改属性,要实现BeanPostProcessor接口

写一个实现类MyBeanPostProcessor

 1 package com.guigu.spring.Car;
 2 
 3 import org.springframework.beans.BeansException;
 4 import org.springframework.beans.factory.config.BeanPostProcessor;
 5 
 6 public class MyBeanPostProcessor implements BeanPostProcessor {
 7 
 8     @Override    //before
 9     public Object postProcessBeforeInitialization(Object bean, String beanName)
10             throws BeansException {
11         System.out.println("postProcessBeforeInitialization: "+bean +beanName);
12         return bean;
13     }
14 
15     @Override    //after
16     public Object postProcessAfterInitialization(Object bean, String beanName)
17             throws BeansException {
18         System.out.println("postProcessAfterInitialization: "+bean +beanName);
19         return bean;
20     }
21 }

 

xml中添加此接口

1   <bean id="car" class="com.guigu.spring.Car" init-method="init" destroy-method="destroy">
2   <property name="brand" value="Aodi"></property>
3   </bean>
4     <!--配置bean后置处理器,不需要配置id-->
5   <bean class="com.guigu.spring.Car"></bean>

 

再重新运行一次,输出:

   构造函数。。
   设置属性。。
   postProcessBoforeInitialization: car[brand=Aodi], car 
init()。。 postProcessAfterInitialization: car[brand=Aodi], car car[brand=Aodi] destroy()。。

注意:一个再init之前调用,一个再init之后调用 

如何修改属性? 在接口函数中修改

 1 package com.guigu.spring.Car;
 2 
 3 import org.springframework.beans.BeansException;
 4 import org.springframework.beans.factory.config.BeanPostProcessor;
 5 
 6 import com.guigu.spring.autowireautowire.Car;
 7 
 8 public class MyBeanPostProcessor implements BeanPostProcessor {
 9 
10     @Override
11     public Object postProcessBeforeInitialization(Object bean, String beanName)
12             throws BeansException {
13         System.out.println("postProcessBeforeInitialization: "+bean +beanName);
14         return bean;
15     }
16 
17     @Override
18     public Object postProcessAfterInitialization(Object bean, String beanName)
19             throws BeansException {
20         System.out.println("postProcessAfterInitialization: "+bean +beanName);
21         Car car = (Car) bean;   // 获取要修改的bean对象
22         car.setBrand("Ford");   //修改属性
23         return bean;
24     }
25 }

 

注意:上面的bean是bean实例本身;beanName指IOC容器配置的bean的名字

这样,就成功修改了属性,输出: 

1    构造函数。。
2    设置属性。。
3    postProcessBoforeInitialization:car[brand=Aodi], car 
4    init()。。
5    postProcessAfterInitialization: car[brand=Aodi], car
6    
7    car[brand=Ford]
8    destroy()。。

 

 还可以过滤,因为处理所有bean时,可能对某些进行操作

 1     @Override
 2     public Object postProcessBeforeInitialization(Object bean, String beanName)
 3             throws BeansException {
 4       System.out.println("postProcessBeforeInitialization: "+bean +beanName);
 5 
 6          if("car".equals(beanName)){
 7             //过滤的操作
 8     }
 9        return bean;
10     }

 

再看一遍bean生命周期

posted on 2016-08-24 18:58  ooooevan  阅读(546)  评论(2编辑  收藏  举报