概念:A、B都是spring容器中的bean,A中有一个属性是B【A依赖于B】,B同样依赖于A。就会出现循环依赖问题
解决方案:set的依赖注入,spring通过三级缓存【三个map】解决的
一级缓存:放的是完整的bean【创建完了,属性也完成赋值的】;singletonObjects
二级缓存:放的是半成品的bean【创建完了,属性未完成初始化】
三级缓存:解决AOP问题,创建的是代理对象
解决没有AOP的循环依赖问题:1、实例化A对象之后,将A对象放入 二级缓存中。
2、在填充A的属性阶段需要去填充B对象,而此时B对象还没有创建,所以这里为了完成A的填充就必须要先去创建B对象。
3、创建B对象的过程中,实例化B对象之后,将B对象放入二级缓存中。
4、执行到B对象填充属性阶段,又会需要去获取A对象,而此时一级缓存中没有A,因为A还没有创建完成,但是我们继续从二级缓存中拿到尚未创建完毕的A的引用赋值给a字段。这样B对象其实就已经创建完整了,尽管B.a对象是一个还未创建完成的对象。
5、此时将B放入一级缓存,并且从二级缓存中删除。
6、这时候B创建完成,A继续执行b的属性填充可以从一级缓存拿到B对象,这样A也完成了创建。
7、此时将A对象放入一级缓存,并从二级缓存中删除。
创建A【要注入B】 ---> A实例化,没有初始化 ---> 从容器中获取并注入B ---> 初始化B【实例化B,注入A】 ---> 从三级缓存中获取创建A的工厂,获取到A的半成品对象,放入到二级缓存中,删除三级缓存中的创建A的工厂【得到一个半成品A】 ---> 于是B就初始化完成了,把B从二级缓存中移动到一级缓存中,B就完成了初始化,是一个完整的bean ---> 继续完成A的初始化,从一级缓存中获取注到B,注入A,把A从二级缓存中移动到一级缓存中,A就完成了初始化
有Aop的循环依赖问题:三级缓存存放创建对象的工厂,用来创建对象
你的项目中有没有循环依赖问题?怎么解决?实际开发中,尽量手动去避免循环依赖的产生
Spring循环依赖解决方法
8万+

被折叠的 条评论
为什么被折叠?



