Spring中的循环依赖问题及解决方案

1.Spring循环依赖

        循环依赖又叫循环引用,及两个对象之间相互持有,形成一个闭环.

        

 代码示例:

        public class A {       private  A  a;     }

        public class B {       private B  b;     }

2.解决方法

   1.通过三级缓存解决

        一级缓存(singletonObjects):存放完成实例化和初始化的对象

        二级缓存(earlySingletonObjects):存放实例化但未初始化的对象

        三级缓存(singletonFactories):存放可以生成bean的工厂

   2.具体实现

        2.1 创建A对象,创建A对象之前先从一级缓存中通过getSingletonObjects()方法获取对象A,如果获取不到,再次调用该方法,再获取不到,就通过getSingletonFactories()方法从三级缓存中获取,如果没有获取到,就调用doCreateBean()方法创建A对象,在A对象实例化完成后,调用populateSet()方法为B进行初始化的时候,容器中并不存在B,此时调用addSingletonObjects()方法将A对象放入三级缓存中

        2.2 创建B对象,创建B对象之前先从一级缓存中通过getSingletonObjects()方法获取对象B,如果获取不到,再次调用该方法,再获取不到,就通过getSingletonFactories()方法从三级缓存中获取,如果没有获取到,就调用doCreateBean()方法创建B对象,通过populateSet()方法为A进行初始化,此时从三级缓存中获取到A完成A的初始化并将A放入二级缓存,B创建完成后调用addSingletonObjects()方法将自己放入一级缓存中

        2.3 完成A对象的创建,A对象从一级缓存中拿到B对象完成B的初始化并将自己放入到一级缓存中

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值