对象的生命周期
指的是对象的创建、存活、消亡的过程。
阶段
Spring工厂为我们提供了对象生命周期中的三个阶段可供定制化操作。
日常开发中,这个用得还是很少的。了解下。
创建阶段
单例对象会在Spring工厂创建时进行创建;非单例对象则是在调用时进行创建。单例对象使用懒加载配置也可以实现在调用时创建的效果。
初始化阶段
Spring工厂在创建完对象后,调用对象的初始化方法完成对应的初始化操作。(在构造方法之后执行)
1.可实现InitializingBean
接口。
public class Product implements InitializingBean {
public Product() {
System.out.println("Product.Product");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("Product.afterPropertiesSet");
}
}
- 使用普通方法来初始化。只能是公开无返回值的方法。此时则需要在配置中指定这个方法名。如
public class Product implements InitializingBean {
public Product() {
System.out.println("Product.Product");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("Product.afterPropertiesSet");
}
public void myInit() {
System.out.println("Product.myInit");
}
}
// beans.xml
<bean id="product" class="com.llh.studyspring.beans.life.Product" init-method="myInit"/>
豆知识
同时使用上面两种方法时,会先执行InitializingBean
接口下的方法,再执行手动指定的方法。
注入在初始化方法之前。
销毁阶段
销毁对象之前调用的方法。Spring工厂关闭时才会进行销毁。
与初始化相似,可实现DisposableBean
接口或是指定特定的方法。
销毁方法只适用于指定为单例的Bean。
Bean的后置处理
使用BeanPostProcessor
接口可以对Bean的初始化做进一步的处理。
postProcessBeforeInitialization
方法在Bean的构造方法和DI之后,postProcessAfterInitialization
则是在指定的init-method
方法之后(如果有的话)。两个方法都会把处理过后的Bean实例返回给Spring,这就是AOP可以直接获取代理对象的机制。
小结
Bean的生命周期简单示意图:
st=>start: Spring 工厂
op=>operation: 调用构造方法
op2=>operation: 进行DI
op3=>operation: 执行InitializingBean中的方法
op4=>operation: 执行init-method指定的方法
op5=>operation: 执行DisposableBean中的方法
op6=>operation: 执行destroy-method指定的方法
op7=>operation: 执行BeanPostProcessor@postProcessBeforeInitialization方法
op8=>operation: 执行BeanPostProcessor@postProcessAfterInitialization方法
e=>end
st->op->op2->op7->op3->op4->op8->op5->op6->e