Spring循环依赖
2021-06-24 16:19:26 8 举报
Spring循环依赖
作者其他创作
大纲/内容
doCreateBean
Byname
有
AutowiredAnnotationBeanPostProcessor.postProcessProperties
afterSingletonCreation(beanName)
beanFactoy.getBean
看Beandefinition是否有指定自动注入是ByName还是Bytype
如果查到了就创建对象,放入2级缓存中
看是否有构造函数上标有@Autowired或只有一个有参构造函数
全流程简述:1:A创建,注入属性时发现需要B->2:B创建,注入属性时发现需要A->3:找到A在三级缓存中暴露的factory,创建没赋值的A,放入二级缓存,防止多线程并发,返回这个A对象->4:这样B可以完整创建了,且B持有的也是A的引用,虽然此时的A没有初始化->5:B创建完成,执行B初始化,这时A就可以创建完成->6:执行A初始化
beforeSingletonCreation(beanName);
3:addSingletonFactory,提前暴露ObjectFactory到三级缓存里,用于解决循环依赖
singletonsCurrentlyInCreation这个集合中添加当前beanName,如果添加不成功,则循环依赖抛出异常
扩展点3
2:applyMergedBeanDefinitionPostProcessors将属性注入的元数据存在元数据缓存里
getSingleton
1:Beanutil反射创建了Bean,然后用BeanWrapper包起来
getBean
ConstructorResolver.autowireConstructor
getSingleton:250行
getSingleton:322行
Ture
ConstructorResolver.createArgumentArray
ByType
4:populateBean属性注入
如果拿到直接返回
false
查看1级缓存里是否有
查看3级缓存里是否有
创建Bean成功
这个过程阐述了为什么构造函数上不能循环依赖
resolveDependency
查看2级缓存里是否有
没有
下图来阐述Spring是如何解决BySettings的循环依赖的
0 条评论
回复 删除
下一页