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
微信公众号:
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |