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
- 调用initMethod方法:invokeInitMethod()
- 调用BeanPostProcessor的后置处理方法:AOP就是在这实现,AbstractAutoProxyCreator
- getBean来获取
- 销毁(执行接口DisposableBean的destroy方法,执行destroyMethod指定的方法)
在配置bean的时候可以加上initMethod和destroyMethod来指定初始化方法和销毁方法,如下
@Bean(initMethod="init", destroyMethod="destroy")
如果存在循环依赖,则AOP代理会提前,不完全按照上述的生命周期来进行。
会提前曝光bean、提前进行AOP代理,把代理过的不完整的bean放入二级缓存
调用过程如下,重点关注finishBeanFactoryInitialization方法和getSingleton方法
AbstractApplicationContext.refresh
AbstractApplicationContext.finishBeanFactoryInitialization
DefaultListableBeanFactory.preInstantiateSingletons
AbstractBeanFactory.getBean
AbstractBeanFactory.doGetBean
DefaultSingletonBeanRegistry.getSingleton
实例化
标签:生命周期,Spring,initMethod,bean,调用,AOP,方法 From: https://www.cnblogs.com/huainanyin/p/18086015