spring单例Bean的生命周期
2020-02-17 15:56:47 0 举报
springIOC是如何解决循环依赖的,spring IOC源码解读
作者其他创作
大纲/内容
开始给bean赋值
resolveValueIfNecessary
getSingleton的addSingleton方法
存放singletonsCurrentlyInCreation方法
返回bean
运行init方法
运行BeanPostProcessorsAfter方法
initializeBean
getSingleton的afterSingletonCreation方法
addSingletonFactory
doCreateBean
查看单例缓存池是否存在该Bean
添加到单例缓存池内this.singletonFactories添加了元素earlySingletonObjects移除当前元素this.registeredSingletons添加了元素
getBean
运行BeanPostProcessorsBefore方法
循环依赖的对象创建比较复杂,比如car和person,我们的car依赖person,person也依赖我们的car,我们要创建car对象,第一次去单例缓存池singletonObject拿一定是没有的,继续往下走,得到一个空壳的car的bean定义,放到singletonFactories下面,然后为这个空壳的car赋值,赋值过程中发现还依赖person对象,于是回去找person对象,发现person并没有创建,也就是在singletonObject下面是没有的,那就先创建person吧,生成空壳的早期person对象,还是放在singletonFactorie下面,这时singletonFactories下面有car和person两个值了,继续赋值,赋值发现又依赖的car,回去找car。但是在getbean过程中发现,car虽然在singletonFactories存在,但是没在earlySingletonObjects,放一个car到earlySingletonObjects内部去,然后移除singletonFactories,这里会有一个疑问就是为什么我们第一次来singletonFactories找,却没有设置earlySingletonObject,这里需要满足bean在singletonFactories下,才可以放入到earlySingletonObject,前两次进来singletonsCurrentlyInCreation也是没有值的,singletonsCurrentlyInCreation是在createBean方法前的getSingleton的方法设置的值. font color=\"#000000\" style=\"\
applyPropertyValues
创建Bean定义运行Bean的构造方法
开始初始剩余单实例非懒加载的Bean
createBeanInstance
finishBeanFactoryInitialization
pvs.isEmpty()
Bean定义
populateBean
是否包含复杂参数(循环依赖)
final Object bean = instanceWrapper.getWrappedInstance()
transformedBeanName
bean
createBean
doGetBean
是
getSingleton
返回Bean
invokeInitMethods
得到早期bean
applyBeanPostProcessorsAfterInitialization
beanFactory.preInstantiateSingletons
applyBeanPostProcessorsBeforeInitialization
移除singletonsCurrentlyInCreation方法
否
getSingleton的addSingleton
pvs不为空
pvs为空直,接返回,说明没有循环依赖
0 条评论
下一页