管理Bean的生命周期

【IOC容器中Bean的生命周期方法】

1.SpringIOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务。

2.Spring IOC容器对Bean的生命周期进行管理的过程:

--通过构造器或工厂方法创建Bean实例

--为Bean的属性设置值和对其他Bean的引用

--调用Bean的初始化方法

--Bean可以使用了

--当容器关闭时,调用Bean的销毁方法

3.在Bean的声明里设置init-method和destroy-method属性,为Bean指定初始化和销毁方法。

【示例】

beans-cycle.xml:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans
 5         http://www.springframework.org/schema/beans/spring-beans.xsd">
 6 
 7     <bean id="car" class="com.hk.beans.cycle.Car"
 8           init-method="init"
 9           destroy-method="destroy">
10        <property name="brand" value="Audi"></property>
11     </bean>
12 </beans>

/spring-1/src/com/hk/beans/cycle/Car.java:

 1 package com.hk.beans.cycle;
 2 
 3 public class Car {
 4     Car() {
 5         System.out.println("Car's Constructor...");
 6     }
 7 
 8     private String brand;
 9     public void setBrand(String brand) {
10         System.out.println("setBrand...");
11         this.brand = brand;
12     }
13     
14     public void init(){
15         System.out.println("init.....");
16     }
17     
18     public void destroy(){
19         System.out.println("destroy......");
20     }
21 }

/spring-1/src/com/hk/beans/cycle/Main.java:

 1 package com.hk.beans.cycle;
 2 
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5 
 6 public class Main {
 7     public static void main(String[] args) {
 8         ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans-cycle.xml");
 9         Car car = (Car) ctx.getBean("car");
10         System.out.println(car);
11         
12         //关闭IOC容器
13         ctx.close();
14     }
15 }

运行结果:

注:通过结果可知Spring IOC容器对Bean的生命周期进行管理的过程和上述一致。

 

【创建Bean后置处理器】

1.Bean后置处理器允许在调用初始化方法前后对Bean进行额外的处理

2.Bean后置处理器对IOC容器里的所有Bean实例逐一处理,而非单一实例。其典型应用是:检查Bean属性的正确性或根据特定的标准更改Bean的属性。

3.对Bean后置处理器而言,需要实现Interface BeanPOSTProcessor接口。在初始化方法被调用前后,Spring将把每个Bean实例分别传递给上述接口的以下两个方法:

-postProcessAfterInitialization(Object bean,String beanName)

-postProcessBeforeInitialization(Object bean,String beanName)

 

【添加Bean后置处理器后Bean的生命周期】

Spring IOC容器对Bean的生命周期进行管理的过程:

--通过构造器或工厂方法创建Bean实例

--为Bean的属性设置值和对其他Bean的引用

--将Bean实例传递给Bean后置处理器的postProcessBeforeInitialization方法

--调用Bean的初始化方法

--将Bean实例传递给Bean后置处理器的postProcessAfterInitialization方法

--Bean可以使用了

--当容器关闭时,调用Bean的销毁方法

配置文件beans-cycle.xml:

1     <!-- 配置bean的后置处理器  -->
2     <bean class="com.hk.beans.cycle.MyBeanPostProcessor"></bean>

/spring-1/src/com/hk/beans/cycle/MyBeanPostProcessor.java:

 1 package com.hk.beans.cycle;
 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
 9     public Object postProcessAfterInitialization(Object bean, String beanName)
10             throws BeansException {
11         System.out.println("postProcessAfterInitialization:"+ bean + "," + beanName);
12         return bean;
13     }
14 
15     @Override
16     public Object postProcessBeforeInitialization(Object bean, String beanName)
17             throws BeansException {
18         System.out.println("postProcessBeforeInitialization:"+ bean + "," + beanName);
19         return bean;
20     }
21 }

运行结果:

应用:

首先确定配置文件中value="Audi":

1     <bean id="car" class="com.hk.beans.cycle.Car"
2           init-method="init"
3           destroy-method="destroy">
4        <property name="brand" value="Audi"></property>
5     </bean>

在MyBeanPostProcessor.java中改变postProcessAfterInitialization中的代码:

1     public Object postProcessAfterInitialization(Object bean, String beanName)
2             throws BeansException {
3         System.out.println("postProcessAfterInitialization:"+ bean + "," + beanName);
4         Car car = new Car();
5         car.setBrand("Ford");
6         return car;
7     }

运行结果:

【小结】

实现BeanPostProcessor接口,并具体提供两个方法的实现:
Object postProcessAfterInitialization(Object bean, String beanName):init-method之前被调用
Object postProcessBeforeInitialization(Object bean, String beanName):init-method之后被调用

参数:
bean:bean实例的本身
beanName:IOC容器中配置bean的名字
返回值:是实际上返回给用户的那个bean,注意:可以在以上两个方法中修改返回的bean,甚至返回一个新的bean.

配置bean的后置处理器 :不需要id,IOC容器自动识别是一个BeanPostProcessor

posted @ 2018-09-11 18:05  猩生柯北  阅读(173)  评论(0编辑  收藏  举报