qidao123.com技术社区-IT企服评测·应用市场

标题: spring详解-bean生命周期 [打印本页]

作者: 灌篮少年    时间: 2025-4-22 20:05
标题: spring详解-bean生命周期
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. //1.给任何 InstantiationAwareBeanPostProcessors 修改 Bean 状态的机会。
  2. //具体是在属性填充之前。Spring 容器会遍历所有注册的 InstantiationAwareBeanPostProcessor,
  3. //依次调用它们的 postProcessAfterInstantiation 方法。如果任何一个处理器返回 false,
  4. //则后续的属性填充操作(包括依赖注入和属性设置)将被跳过
  5. InstantiationAwareBeanPostProcessor :: postProcessAfterInstantiation()
  6. // 2.postProcessProperties
  7. // 例如:字段注入 AutowiredAnnotationBeanPostProcessor
  8. // 处理带有 @Autowired 和 @Value 注解的字段,根据相应的规则进行依赖注入 --- metadata.inject
  9. InstantiationAwareBeanPostProcessor :: postProcessProperties()
复制代码
最后,实行初始化exposedObject = initializeBean(beanName, exposedObject, mbd);。
  1. //1.先后顺序:BeanNameAware;BeanClassLoaderAware;BeanFactoryAware
  2. invokeAwareMethods(beanName, bean);
  3. //2.Bean初始化前置处理 【@PostConstruct -- CommonAnnotationBeanPostProcessor】
  4. BeanPostProcessor :: postProcessBeforeInitialization();
  5. //3.初始化
  6. /*
  7. InitializingBean :: afterPropertiesSet()
  8. initMethod
  9. */
  10. invokeInitMethods(beanName, wrappedBean, mbd);
  11. //4.Bean初始化后置处理【例如:生成aop代理对象】
  12. BeanPostProcessor :: postProcessAfterInitialization
复制代码
大致就是上述四步了。
3.烧毁bean

按照先后顺序:
  1. @Component
  2. public class DestoryBeanDemo implements DisposableBean {
  3.     @Override
  4.     public void destroy() throws Exception {
  5.         System.out.println("【DisposableBean 接口】 销毁");
  6.     }
  7.     @PreDestroy
  8.     public void preDestroy(){
  9.         System.out.println("【@PreDestroy 注解】 销毁");
  10.     }
  11. }
复制代码
实行容器关闭的时间,走这里
  1. public void destroy() {
  2.     if (!CollectionUtils.isEmpty(this.beanPostProcessors)) {
  3.         for (DestructionAwareBeanPostProcessor processor : this.beanPostProcessors) {
  4.             // 1.@PreDestroy 注解方法
  5.             processor.postProcessBeforeDestruction(this.bean, this.beanName);
  6.         }
  7.     }
  8.     ...
  9.     //2.DisposableBean接口
  10.     ((DisposableBean) this.bean).destroy();
  11.     ....
  12.     //3.自定义 destroy-method
  13.     invokeCustomDestroyMethod
  14. }
复制代码
end. contact

博客园:https://www.cnblogs.com/jackjavacpp
微信公众号:

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




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4