SpringBoot中bean的生命周期
BeanDefinition的产生:
SpringBoot在启动过程中,主要是刷新上下文的时候会将绝大部分的需要的bean生成BeanDefinition加入到容器(DefaultListableBeanFactory的beanDefinitionMap)
Bean的生命周期:
会在SpringBoot启动过程中的刷新上下文的finishBeanFactoryInitialization方法里开始进行bean的生命周期
按照bean name的字母顺序来开始bean的生命周期,因为涉及到属性的注入,所以得结合属性注入的情况才能最终知道哪个bean最先加入IoC容器
- 实例化bean(反射),并加入三级缓存
- 填充bean属性:populateBean(使用三级缓存来解决循环依赖问题)
- 调用aware接口相关方法:invokeAwareMethod(完成BeanName,BeanFactory,BeanClassLoader对象的属性设置)
- 调用BeanPostProceessor中的前置处理方法:常用的有ApplicationContextPostProcessor,包括执行@PostConstruct方法
- 调用initMethod方法:invokeInitMethod
- 调用BeanPostProcessor的后置处理方法:AOP就是在这实现,AbstractAutoProxyCreator
- getBean来获取
- 销毁(执行接口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