bean初始化流程
2021-04-13 10:59:51 7 举报
SPring bean初始化
作者其他创作
大纲/内容
没有
初始化bean
直接用
是,直接返回,不进行后续流程
invokeInitMethods
InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation尝试直接返回对象
遍历获取所有Bean进行创建获取
《Bean生命周期流程》接下来就是BeanPostProcessor整个生命周期干预流程
获取当前bean依赖的所有组件
BeanPostProcessor.postProcessAfterInitialization;属性设置完成后增强
对象成功创建
对象创建成功后移除
调用singletonFactory的lamda的创建对象
singletonObjects(单例组件享元池)
InitializingBean.afterPropertiesSet属性设置完成后做事
有
是
提前暴露单实例bean
MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition;处理bean定义信息
进入以下创建bean实例流程
1.移除singletonCurrentlyInCreation里面bean的名字
属性赋值
是否工厂Bean
看父工厂有没有这个组件
wrapper(还有功能增强)/holder (只来包装)
bean全部创建完成以后
InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation 决定后续处理器是否继续
BeanPostProcessor.postProcessAfterInitialization把上面返回的对象再加工
BeanPostProcessor.postProcessBeforeInitialization;继续增强bean
doGetBean()
invokeAwareMethods
否
alreadyCreated(已经创建了的Bean的名字集合【备忘录模式】)
createBean(beanName)创建组件对象
返回
结束后逻辑
遍历所有bean执行SmartInitializingSingleton.afterSingletonsInstantiated
Bean初始化流程-GetBean()的详细逻辑
检查单例池中是否有?singletonObjects
把当前正要创建的对象的beanName保存起来
有没有依赖的组件
第一次会返回null
创建之前
是否获取到bean
详情参照《Bean生命周期流程》
InstantiationAwareBeanPostProcessor.postProcessProperties处理属性,如自动装配功能
对象创建
否,普通类名
拿到创建好的对象返回
getBean(beanName)
工厂bean的流程
cat
1.先看单例池有没有2.再看是否这个bean正在创建
singletonsCurrentlyInCreation 《Set》(正在创建的组件名字池)
以上返回了对象?
getSingleton(beanName)
单实例、非抽象、非懒加载
再做其他事情
上面返回了真实对象(实际上很少返回)
0 条评论
下一页