管理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