SpringBoot中bean的生命周期

BeanDefinition的产生:

SpringBoot在启动过程中,主要是刷新上下文的时候会将绝大部分的需要的bean生成BeanDefinition加入到容器(DefaultListableBeanFactory的beanDefinitionMap)

 

 

Bean的生命周期:

会在SpringBoot启动过程中的刷新上下文的finishBeanFactoryInitialization方法里开始进行bean的生命周期

按照bean name的字母顺序来开始bean的生命周期,因为涉及到属性的注入,所以得结合属性注入的情况才能最终知道哪个bean最先加入IoC容器

  1. 实例化bean(反射),并加入三级缓存
  2. 填充bean属性:populateBean(使用三级缓存来解决循环依赖问题)
  3. 调用aware接口相关方法:invokeAwareMethod(完成BeanName,BeanFactory,BeanClassLoader对象的属性设置)
  4. 调用BeanPostProceessor中的前置处理方法:常用的有ApplicationContextPostProcessor,包括执行@PostConstruct方法
  5. 调用initMethod方法:invokeInitMethod
  6. 调用BeanPostProcessor的后置处理方法:AOP就是在这实现,AbstractAutoProxyCreator
  7. getBean来获取
  8. 销毁(执行接口DisposableBean的destroy方法,执行destroyMethod指定的方法)

 

 

 

 

在配置bean的时候可以加上initMethod和destroyMethod来指定初始化方法和销毁方法,如下

@Bean(initMethod="initMethod", destroyMethod="destroyMethod")

 

如果存在循环依赖,则AOP代理会提前,不完全按照上述的生命周期来进行。

会提前曝光bean、提前进行AOP代理,把代理过的不完整的bean放入二级缓存

 

 

调用过程如下

AbstractApplicationContext.refresh
AbstractApplicationContext.finishBeanFactoryInitialization
DefaultListableBeanFactory.preInstantiateSingletons
AbstractBeanFactory.getBean
AbstractBeanFactory.doGetBean
DefaultSingletonBeanRegistry.getSingleton

AbstractAutowireCapableBeanFactory.createBean

AbstractAutowireCapableBeanFactory.doCreateBean

 

重点看一下doCreateBean里面做的事情

 

 

以上就是bean实例化,初始化

接下来就是被放入IoC容器,

使用

销毁

 

doCreateBean
posted @ 2024-03-21 15:07  坏男银  阅读(26)  评论(0编辑  收藏  举报