spring如何解决循环依赖问题
更新时间:2024年10月14日 10:19:24 作者:loveLifeLoveCoding
Spring在单例模式下用三级缓存设计解决setter方法注入bean属性循环依赖问题,但无法解决多例Bean和构造方法注入参数的循环依赖,三级缓存通过A、B两对象互相注入属性的过程解决循环依赖,其中,构造方法的循环依赖无法解决是因为创建对象会走构造方法
spring解决循环依赖
Spring 中使用了三级缓存的设计,来解决单例模式下的属性循环依赖问题。
解决的只是单例模式下 setter 方法注入bean属性循环依赖问题,
对于多例 Bean 和 构造方法注入 参数的循环依赖问题,并不能使用三级缓存设计解决。
缓存变化过程

- A实例化后、注入前放到3级缓存
- A在注入属性时,发现有循环依赖,因此需要先getBean(B),实例化B,并将B也 从入3级缓存
- B放到3级缓存后,这时B要开始注入属性A,于是B找到了循环依赖A后,再从头执行getBean(A)方 法,getSingleton方法本次从缓存中取,然后将A设置到2级缓存,并且从3级缓存移除。
- B如愿以偿的拿到了A完成注入,然后B执行到DefaultSingletonBeanRegistry#addSingleton方 法,将B从3级缓存移出,放入1级缓存,到此B完成。B的完成是被动的,A需要它,才会先去创建 它
- A 还要继续自己的流程,然后populateBean方法将B注入。然后,A移出2级缓存,进入1级缓存, 整个流程完成!

为什么不能解决非单例、构造方法的循环依赖问题
为什么不能解决构造方法的循环依赖?
- 创建对象会走构造方法,而构造方法的参数是互相依赖的对象
- 此时都还没有初始化创建完成,因此无法进行实例化创建
为什么不能解决多例的循环依赖?
- IoC容器只会管理单例Bean,并将单例Bean存入缓存。
- 作用域为prototype时,每次getBean 都会创建新的对象,并不存入缓存,因此不可以解决循环依赖问题。
解决方法
避免循环依赖:
引入第三个类C, A 和 B 都依赖 C, 而不是相互依赖
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
SpringCloud及Nacos服务注册IP选择问题解决方法
这篇文章主要介绍了SpringCloud及Nacos服务注册IP选择问题,为什么注册的IP和真实IP不符合呢,原因是Nacos客户端在注册服务时会从机器网卡中选择一个IP来注册,所以,当注册了的是非真实IP后,另一台机器调用时是不可能调通的,知道问题原因就是解决方法,一起看看吧2024-01-01
Java elasticSearch-api的具体操作步骤讲解
这篇文章主要介绍了elasticSearch-api的具体操作步骤讲解,本文通过详细的步骤介绍和图文代码展示讲解了该项技术,需要的朋友可以参考下2021-06-06
SpringBoot详解如果通过@Value注解给静态变量注入值
这篇文章主要介绍了springboot如何通过@Value给静态变量注入值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-06-06


最新评论