Bean 生命周期
JVM 管理对象是也有一套生命周期
Spring 也有一套生命周期
JVM 和 Spring 没有太大关系,JVM 生命周期完成后才是 Spring 生命周期
Bean 初始化的前提是 对象(实例)的初始化
注意
- 不管是初始化方法还是销毁方法,两种方式(框架提供的和自定义)可以同时存在,但是框架提供的在自定义前面执行
spring
管理bean
的生命周期(完整的)是针对单例的bean
,通过原型创建的bean
不会纳入spring
容器中,因此不会执行生命周期(不完整的,销毁方法无法执行)
初始化方法
框架提供的接口
实现 InitializingBean
接口,并实现其中的 afterProperties
方法
自定义方法
自定义初始化方法,并通过 init-method
属性来指定即可,案例如下
销毁方法
销毁方法仅限于单例的 Bean
对象,因为原型容器存储的是 Class
类型,所以原型容器创建的对象是一次性的,无法执行销毁方法。
框架提供的接口
实现 DisposableBean
接口,并实现其中的 destroy
方法
自定义方法
自定义销毁方法,并通过 destroy-method
属性来指定即可,案例如下
后置处理器
装配后置处理器,在初始化方法执行前的和执行后执行
注意 后置处理器的方法是针对所有的 Bean 对象,而不是单独的某一个 Bean
案例
@Slf4j
public class MyBeanPostProcessor implements BeanPostProcessor {
/**
* 在初始化方法前
* @param bean the new bean instance
* @param beanName the name of the bean
* @return
* @throws BeansException
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
log.debug("在初始化方法前");
return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
}
/**
* 在初始化方法后
* @param bean the new bean instance
* @param beanName the name of the bean
* @return
* @throws BeansException
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
log.debug("在初始化方法后");
return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
}
}
beans.xml案例
<bean id="唯一标识符" class="完整类名" init-method="自定义初始化方法" destroy-method="自定义销毁方法"/>
<bean class="后置处理器的完整类名"/>