Spring解决循环依赖
2020-06-11 13:42:25 0 举报
spring解决循环依赖的流程
作者其他创作
大纲/内容
userService把indexService属性注入成功
第一次getSingleton():从单例池中拿单例,拿不到。Set集合singletonsCurrentlyInCreation中也没有indexService
第一次inject()
populateBean():要注入userService属性
populateBean():要注入indexService属性
...
不进入第二次的getSingleton()
createBeanInstance():实例化了userService对象
第一次getSingleton():从单例池中拿单例,拿不到。Set集合singletonsCurrentlyInCreation中也没有userService
getBean(\"userService\"):因为要注入userService属性就要首先获取userService这个bean,所以执行getBean(),从这里开始就变成了userService的生命周期开始执行
进入getObjectForBeanInstance():上一步拿到的不是factoryBean则返回出来(这里主要是对那些factoryBean做处理)
假设第一次getBean()时beanName是indexService
getObjectForBeanInstance()
判断是否支持循环依赖,若支持则进入addSingletonFactory():把半成品bean(userService)放入第二个map(即singletonFactories),从第三个map(earlySingletonObjects)中移除这个半成品bean
第二次getSingleton():进入beforeSingletonCreation(),把userService放入Set集合singletonsCurrentlyInCreation
第一次getSingleton():从单例池中拿单例,拿不到。Set集合singletonsCurrentlyInCreation中有indexService,则允许去第三个map(earlysingletonObjects)中拿,拿不到。则去第二个map(singletonFactories)拿factory,再从factory中拿半成品bean,拿到了。返回出去
省略中间n个步骤
return getBean()
判断是否支持循环依赖,若支持则进入addSingletonFactory():把半成品bean(indexService)放入第二个map(即singletonFactories),从第三个map中(earlySingletonObjects)移除这个半成品bean
第二次重载的inject()
最终全部注入成功
getBean(\"indexService\"):因为要注入indexService属性就要首先获取indexService这个bean,所以执行getBean(),从这里又变成了indexService的生命周期开始执行
第二次getSingleton():进入beforeSingletonCreation(),把indexService放入Set集合singletonsCurrentlyInCreation
return ...
new AnnotationConfigApplicationContext
createBeanInstance():实例化了indexService对象
收藏
收藏
0 条评论
下一页