Bean生命周期
在经过三篇文章的分析过后,我们对Spring容器的创建过程有了一个大致的认识:
文章一:
SpringBoot启动run方法分析: https://blog.csdn.net/okok__TXF/article/details/147009731
SpringBoot-run方法分析
文章二:
Spring分析-IOC:https://blog.csdn.net/okok__TXF/article/details/147285599
SpringIOC容器创建
文章三:
Spring分析-AOP:https://blog.csdn.net/okok__TXF/article/details/147397816
Spring分析-AOP
我们都知道是在refresh()
方法里面进行的,本文就来对Bean的生命周期作一个总结,本文就不探讨具体源码了。
1.bean工厂的后处理器
invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory)
通过对该方法的源码查看调试,我们得知invokeBeanFactoryPostProcessors方法会把所有实现BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor的类进行实例化和调用。
BeanDefinitionRegistryPostProcessor :: postProcessBeanDefinitionRegistry()方法:所有常规 bean 定义都已加载,但尚未实例化任何 bean。这允许在下一个后处理阶段开始之前添加更多的 bean 定义。也就是说可以增加额外的BeanDefinition。
BeanFactoryPostProcessor :: postProcessBeanFactory()方法:所有 bean 定义都已加载,但尚未实例化任何 bean。这允许覆盖或添加属性,甚至允许预先初始化 bean。也就是说可以修改BeanDefinition。
对上面两个有了这些认识,很显然就可以知道BeanDefinitionRegistryPostProcessor是先于BeanFactoryPostProcessor 一步执行的。
2.实例化单例
finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory)
这个里面我们也是非常有映象了,在AbstractAutowireCapableBeanFactory :: createBean(xx)
方法里面:
首先,实例化instanceWrapper = createBeanInstance(beanName, mbd, args);
然后,对指定 bean 的给定合并 bean 定义进行后处理,applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
,这个就是执行MergedBeanDefinitionPostProcessor :: postProcessMergedBeanDefinition(xxx)方法了;
其次,属性填充populateBean(beanName, mbd, instanceWrapper);
在这个属性填充里面
//1.给任何 InstantiationAwareBeanPostProcessors 修改 Bean 状态的机会。
//具体是在属性填充之前。Spring 容器会遍历所有注册的 InstantiationAwareBeanPostProcessor,
//依次调用它们的 postProcessAfterInstantiation 方法。如果任何一个处理器返回 false,
//则后续的属性填充操作(包括依赖注入和属性设置)将被跳过
InstantiationAwareBeanPostProcessor :: postProcessAfterInstantiation()
// 2.postProcessProperties
// 例如:字段注入 AutowiredAnnotationBeanPostProcessor
// 处理带有 @Autowired 和 @Value 注解的字段,根据相应的规则进行依赖注入 --- metadata.inject
InstantiationAwareBeanPostProcessor :: postProcessProperties()
最后,执行初始化exposedObject = initializeBean(beanName, exposedObject, mbd);
。
//1.先后顺序:BeanNameAware;BeanClassLoaderAware;BeanFactoryAware
invokeAwareMethods(beanName, bean);
//2.Bean初始化前置处理 【@PostConstruct -- CommonAnnotationBeanPostProcessor】
BeanPostProcessor :: postProcessBeforeInitialization();
//3.初始化
/*
InitializingBean :: afterPropertiesSet()
initMethod
*/
invokeInitMethods(beanName, wrappedBean, mbd);
//4.Bean初始化后置处理【例如:生成aop代理对象】
BeanPostProcessor :: postProcessAfterInitialization
大致就是上述四步了。
3.销毁bean
按照先后顺序:
- @PreDestroy 注解方法
- DisposableBean#destroy()
- 自定义 destroy-method
@Component
public class DestoryBeanDemo implements DisposableBean {
@Override
public void destroy() throws Exception {
System.out.println("【DisposableBean 接口】 销毁");
}
@PreDestroy
public void preDestroy(){
System.out.println("【@PreDestroy 注解】 销毁");
}
}
执行容器关闭的时候,走这里
public void destroy() {
if (!CollectionUtils.isEmpty(this.beanPostProcessors)) {
for (DestructionAwareBeanPostProcessor processor : this.beanPostProcessors) {
// 1.@PreDestroy 注解方法
processor.postProcessBeforeDestruction(this.bean, this.beanName);
}
}
...
//2.DisposableBean接口
((DisposableBean) this.bean).destroy();
....
//3.自定义 destroy-method
invokeCustomDestroyMethod
}
end. contact
博客园:https://www.cnblogs.com/jackjavacpp
微信公众号:
来源链接:https://www.cnblogs.com/jackjavacpp/p/18841499
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
暂无评论内容