Bean生命周期:
Bean创建=》初始化=》销毁的过程,我们称之为Bean的生命周期。
Spring里面,是由容器来管理Bean的生命周期。
我们可以自定义初始化和销毁方法,容器在Bean进行到当前生命周期的时候,就会调用我们自定义的初期化和销毁方法。
调用顺序如下:
① 构造对象(对象创建)
单实例:容器启动的时候,创建对象
多实例:在每次获取对象的时候,创建对象
② BeanPostProcessor. postProcessBeforeInitialization(对象创建完成,赋值之后初始化方法调用之前)
③ 初始化
对象创建完成,并赋值好之后,调用初始化方法。(包含我们自定义的初始化方法)
④ BeanPostProcessor.postProcessAfterInitialization(初始化方法调用之后)
⑤ 销毁
单实例:容器关闭的时候,销毁对象。
对于单实例Bean来说,构造和初始化都是在容器创建的时候执行的。构造和初始化方法调用完毕,容器启动成功。销毁是在容器关闭的时候执行的。执行完销毁方法后,容器关闭成功。
多实例:容器只负责创建,不负责管理该Bean对象(创建之后就教给用户来管理,所以不会调用销毁方法。)。
其中:
第一:Spring Bean配置后置器BeanProcessor的执行原理:
1)、遍历得到容器中所有的BeanPostProcessor,挨个执行BeforeInitialization。一旦其中一个返回null,则直接跳出循环。不会再继续执行后面的BeanPostProcessor
2)、populateBean(beanName, mbd, instanceWrapper);-----(给Bean进行赋值)
赋值完之后,进行初始化
initializeBean(beanName, exposedObject, mbd);
{
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
invokeInitMethods(beanName, wrappedBean, mbd);
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
第二:
如何自定义初始化方法:
①、通过@Bean注解指定init-method,detroy-method来指定初始化和销毁方法。
②、通过实现Spring提供的两个接口:InitializingBean和DisposableBean来指定初始化和销毁方法。(分别重写两个接口的afterPropertiesSet和destroy方法)
③、使用JSR250(java规范)提供的两个注解来指定(注意下面两个注解不属于Spring,是属于J2EE的):
@PostConstruct 在Bean创建完成并且属性赋值完毕后,执行
@PreDestroy 在容器销毁Bean之前通知我们执行清理工作
④、使用Spring提供的interface BeanPostProcessor,Bean的后置处理器来指定(此处并非指定初始化或销毁方法,而是在初始化方法调用前后通过后置处理器来设置某些处理)
在Bean调用初始化方法前后进行一些处理工作
postProcessBeforeInitialization:初始化之前工作(afterPropertiesSet or a custom init-method之前)
postProcessAfterInitialization:初始化之后工作
第三:
Spring底层对BeanPostProcessor的使用:
Bean赋值,获取容器对象,@AutoWired(AutowiredAnnotationBeanPostProcessor),生命周期注解功能(@PostConstruct/@PreDestroy)等等,都是通过后置处理器来实现的。
网友评论