IOC解决循环依赖问题
2021-12-14 19:20:02 1 举报
Spirng 中解决循环依赖详细流程
作者其他创作
大纲/内容
studentB
三
singletonObjects
一
earlySingletonObjects
singletonFactory
studentA
退出第二次递归getBean(\"studentB\")
singletonsCurrentlyInCreation
第二次递归getBean(\"studentA\")
this.singletonFactories.get(beanName);从三级缓存中获取,可以获取到最开始放入其中的函数接口
singletonFactory.getObject();调用函数接口中的bean的后置处理器,如果bean需要动态代理会在这里创建
addSingletonFactory()将bean实例放入三级缓存
八
populateBean();属性赋值,在这个过程中会调用beanFactory.getBean(beanName);获取studentB的实例进行递归
this.earlySingletonObjects.get(beanName);因为当前bean放入了正在被创建的标志集合,这里还会尝试从二级缓存中获取,同样为null
退出第一次递归回到首次调用getBean(\"studentA\")
首次调用getBean(\"studentA\")
this.singletonsCurrentlyInCreation.remove(beanName)从正在创建bean标注集合中移除
四
二
singletonObjects 一级缓存earlySingletonObjects 二级缓存singletonFactory 三级缓存singletonsCurrentlyInCreation bean是否正在创建标记
createBeanInstance创建bean实例
七
返回studentB实例对studentA进行属性赋值
第一次递归和首次调用流程完全一致getBean(\"studentB\")
九
六
Object singletonObject = this.singletonObjects.get(beanName);从一级缓存中获取bean实例,第一次这里为null
@Componentpublic class StudentA { @Autowired private StudentB studentB;}
五
@Componentpublic class StudentB { @Autowired private StudentA studentA;}
退出第二次递归回到getBean(\"studentB\")
singletonsCurrentlyInCreation.add(beanName)标记当前bean正在被创建,将beanName放入其中
创建StudentB 成功,再次退出递归
退出第一次递归回到getBean(\"studentA\")
getBean(\"studentA\")
this.singletonObjects.get(beanName);从一级缓存中获取,同样为null
第一次递归getBean(\"studentB\")
0 条评论
下一页