Bean生命周期流程图
2021-09-27 13:24:57 0 举报
Spring中的Bean生命周期流程图,根据不同颜色区分了增强器,方便学习、复习使用。
作者其他创作
大纲/内容
后置增强 BeanFactory
Spring的自动装配后置处理器在此工作,真正进行自动装配
Bean定义信息清单
按照类型去容器中找组件
是
finishBeanFactoryInitialization(beanFactory)完成剩下的所有Bean组件的创建
InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()
MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition();处理合并bd信息,再修改bean定义信息
Ordered
以上说明Bean工厂的增强逻辑先执行
doGetBeanNamesForType(XXX.class)
registerListeners()注册监听器Spring事件监听机制在这里开始初始化
在组件对象创建之前还有机会改一下他的类型
否
getBean
创建Bean的实例使用BeanWrapper
使用默认无参构造器
SmartInstantiationAwareBeanPostProcessor
完成
getBean结束
没有实现任何排序接口
InstantiationAwareBeanPostProcessor
1、拿到所有组件的名字;beanDefinitionNames2、遍历每一个组件名字3、再去beanDefinitionMap找bean的定义信息4、从定义信息中获取组件的类型5、看这个类型是否匹配
return wrapperBean
整个后置处理围绕着整个Bean的创建和初始化过程对Bean的功能进行改造
BeanPostProcessor
我们返回的构造器
容器要挨个创建所有组件,在组件创建过程中,会有各种后置增强器增强组件的功能,以完成spring底层各种牛逼的特效
Spring的自动装配后置处理器在此工作直接返回true
Spring如何在容器中按照类型找组件
核心组件的执行时机
属性赋值populateBean
方法执行
典型代表
大于
invokeCustomInitMethod()执行自定义初始化方法
返回null
获取到所有BeanDefinitionRegistryPostProcessor并创建对象,Bean定义信息注册中心增强器
核心组件的对象创建时机
registerBeanPostProcessors(beanFactory)注册所有的Bean的后置处理器
ConfigurationClassPostProcessor配置类的后置处理工厂准备好后就得解析配置类的信息
获取到所有BeanFactoryPostProcessor并创建对象,Bean工厂的增强
postProcessBeanFactory
返回PropertyValues
getBean(beanName)
Spring工厂
MergedBeanDefinitionPostProcessor(内部的)
doGetBeanNamesForType(ApplicationListener.class)
ConfigurationClassParser解析配置类信息,使用doProcessConfigurationClass方法
for创建所有Processor对象
postProcessBeanDefinitionRegistry(registry)
依赖了其他组件
doGetBeanNamesForType根据类型获取Bean名字
invokeAwareMethods()BeanNameAware、BeanClassLoaderAware、BeanFactoryAware的实现
构造器方式的自动装配创建bean
创建对象
流程
工厂提前保存所有增强器,方便在后面创建Bean的时候直接使用
工厂创建好了就进行增强invokeBeanFactoryPostProcessors(beanFactory)执行Bean工厂的后置增强功能
PriorityOrdered
ApplicationContextAwareProcessor注入Aware相关组件
Spring 容器启动过程
自动装配
BeanPostProcessor.postProcessAfterInitialization;初始化之后的增强处理改变之前创建的Bean实例
三种生命周期增强器
组件自己实现 InitializingBean
当前遍历beanName如果没有创建好单例对象
设置属性Spring把PropertyValues中所有的属性值进行反射赋值
createBean(beanName)
获取监听器组件的名字
invokeAwareMethods()执行初始化方法
处理配置类内容
1)、给AbstractApplicationContext.refresh()方法的最后一行打上断点,分析工厂中新增了哪些后置处理器。getBean的整个环境,都干了什么?循环依赖?AOP、循环依赖。2)、分析下、Spring在哪些环节想给容器中注册哪些Bean定义信息。给RootBeanDefintion构造器打断点;能看到Spring的整个完整图谱。
BeanPostProcessor.postProcessBeforeInitialization();初始化之前的增强处理改变之前创建的Bean实例
InstantiationAwareBeanPostProcessorpostProcessProperties();处理属性值
InitializingBean.afterPropertiesSet();可以在当前组件所有属性全部就绪后继续进行增强
SmartInstantiationAwareBeanPostProcessor.predictBeanType(); 决定当前未初始化的组件类型
SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors();决定构造器
InstantiationAwareBeanPostProcessorpostProcessAfterInstantiation();初始化之后进行处理
PostProcessorRegistrationDelegate代理执行所有后置增强器的功能
Bean生命周期流程
决定使用的构造器
是否创建了对象
闭环逻辑(容器中有就拿来用,没有就创建)循环依赖所有组件的获取都是getBean
底层实现如下
收藏
收藏
0 条评论
下一页