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

posted @   xiaoxiaoguai98  阅读(1525)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示