10.Spring Bean的生命周期
Spring IOC容器可以管理Bean的生命周期,允许在Bean声明周期的特定点执行定制的任务。
Spring IOC容器对Bean的生命周期进行管理的过程。
1.通过构造器或工厂方法创建Bean实例
2.位Bean的属性设置值和对其他Bean的引用
3.调用Bean的初始化方法
4.使用Bean
5.当容器关闭时,调用Bean的销毁方法
在Bean的声明里设置init-method和destory-method属性,为Bean指定初始化和销毁方法。
Spring IOC容器提供后置处理器在对IOC容器的所有Bean实例逐一处理,而非单一实例,可以用来检查Bean属性的正确性或根据特定的标准更改Bean的属性。
对与Bean的后置处理器,需要实现BeanPostProcessor接口,在初始化方法前后,Spring将把每个Bean实例分别传递给接口的两个方法postProcessBeforeInitialization和postProcessAfterInitialization。
如果实现了Bean的后置处理器接口。
Bean的生命周期过程则是:
1.通过构造器或工厂方法创建Bean实例
2.位Bean的属性设置值和对其他Bean的引用
3.将Bean实例传递给postProcessBeforeInitialization方法,并调用
4.调用Bean的初始化方法
5.将Bean实例传递给postProcessAfterInitialization方法,并调用
6.使用Bean
7.当容器关闭时,调用Bean的销毁方法
public class Car {//bean类 public Car() { System.out.println("com.cn.Car's Constructor"); } private String brand; public void setBrand(String brand) { System.out.println("setBrand"); this.brand = brand; } /** * 初始化方法 */ public void init() { System.out.println("init"); } /** * 销毁方法 */ public void destory() { System.out.println("destroy"); } }
public class MyBeanPostProcessor implements BeanPostProcessor{//后置处理器的实现类 @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessBeforeInitialization: " + beanName); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessAfterInitialization: " + beanName); return bean; } }
<!-- 配置文件 -->
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="car" class="com.cn.Car" init-method="init" destroy-method="destory"> <property name="brand" value="test"></property> </bean> <!-- bean的后置处理器不需要配置id,IOC容器会自动识别后置处理器--> <bean class="com.cn.MyBeanPostProcessor"></bean> </beans>
public class Main { public static void main(String[] args) {
//测试代码 ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("10.xml"); Car car = (Car) ctx.getBean("car"); System.out.println(car); ctx.close(); } }
//测试结果
com.cn.Car's Constructor setBrand postProcessBeforeInitialization: car init postProcessAfterInitialization: car com.cn.Car@1615f43d destroy