spring构造器循环依赖

spring不能解决构造器循环依赖的原因

了解IOC流程

1.getBean -> 2.第一个getSingleton(在三级缓存取bean) -> 3.第二个getSingleton(去创造bean) -> 4.beforeSingletonCreation(向singletonsCurrentlyInCreation中添加正在创建的bean) -> 5.createBean -> 6.doCreateBean(从上至下调用的方法为:createBeanInstance,addSingletonFactory放入三级缓存中,populateBean填充属性,initializeBean初始化bean) -> 7.放入单例池中

构造器循环依赖不能解决的原因

如果是构造器注入的话(假如有A、B类,A先B后),A第一次先把自己放入singletonsCurrentlyInCreation中,然后在createBeanInstance时会去调用@AutoWired标注的有参构造器(此时A没有实例化,连对象都没创建),然后会去getBean(B),这就回到了上方流程的开头,B在第一个getSingleton没有获取到A,然后就去getBean(A),对于A来说已经是第二次了,于是在向singletonsCurrentlyInCreation添加的时候就会报错,因为该集合已经有了A,因此异常在此处抛出。
如果是set注入,A在createBeanInstance时则会调用无参构造方法,在populateBean(此时A已经放入三级缓存了)时调用getBean(B),而B再去getBean(A)的时候(无论B是在@AutoWired标注的有参构造器还是无参构造去获取A),直接就能从三级缓存中得到,解决循环依赖。

构造器循环依赖不一定不能解决

根据上文最后一句话可知,A先B后,A用set注入,B是构造器注入,这样的循环依赖也是可以被解决的

参考文章

https://blog.csdn.net/CSDN_WYL2016/article/details/108125307
https://blog.csdn.net/csdn_wyl2016/article/details/108146174
https://cloud.tencent.com/developer/article/1749830

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值