spring singleton循环依赖的一个探索

这两天稍微看了一点spring bean生成的源码,算是自己探索了一点点东西,感觉这块稍微明白了一点,下面定义的A和B都是Singleton

注意!:如果A是构造器依赖,B是Setter依赖,A和B循环依赖时,如果先加载的是B,则不会出现循环依赖异常,因为B加载时会先将未依赖A的B实例放入缓存,然后递归到A进行有参数构造器初始化,这时A可以拿到B的实例完成注入,然后B也可以依赖A

但是反过来不行,如果先加载A,那么A会执行有参数的构造器,这时没有A的实例构造出来,缓存中没有A,在构造A前递归构造B,虽然有一个未依赖A的B的实例被放入缓存,但是由于B依赖A没有成功,所以需要递归创建A来依赖,但这时A已经在正在singletonsCurrentlyInCreation中了,所以检测到循环依赖,从而抛出异常

注意2!:上面的这个问题在不开启懒加载时不一定能复现,因为非懒加载模式下的Bean会被依次加载,所以A和B的先后顺序不一定。想要复现需要让A和B都懒加载,然后使用context.getBean(A.class)才能稳定复现,因为这时会先加载A

好久没写博客了,一般的知识点都记在文档里,感觉大家都知道的东西没必要发出来制造垃圾

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值