Spring循环依赖问题
# 循环依赖三种场景
- 情况一:自己依赖自己
- 情况二:A依赖B,B依赖C
- 情况三:A依赖B,B依赖C,C依赖A,形成一个环
# SpringBean的生命周期
- Spring初始化
getBean()方法
:反射的方式去加载配置文件- 实例化
- 属性注入
- 初始化
- 销毁
# Spring执行逻辑
- 先从“第一级缓存”找对象,有就返回,没有就找“二级缓存”;
- 找“二级缓存”,有就返回,没有就找“三级缓存”;
- 找“三级缓存”,找到了,就获取对象,放到“二级缓存”,从“三级缓存”移除。
# 循环依赖的问题
现在假设没有三级缓存下,针对A和B相互依赖进行分析,流程图如下:
- 当A进行属性注入的时候,由于需要依赖B,因此B需要进行实例化
- B进行属性注入的时候,由于又需要依赖A,因此A又需要进行实例化,最终形成环,造成循环依赖问题。
# 三级缓存如何解决循环依赖问题
# 各级缓存的作用
- 一级缓存:为Spring 的单例属性而生,就是个单例池,用来存放已经初始化完成的单例 Bean;
- 二级缓存:为解决 AOP而生,存放的是半成品的 AOP 的单例 Bean;
- 三级缓存:为打破循环而生,存放的是生成半成品单例 Bean 的工厂方法。
# A和B相互依赖再分析
- A实例化的时候,会把A工厂对象放入三级缓存
- 当B属性注入的时候,需要去获取B,这个时候就直接从三级缓存中拿对象即可,避免了环的形成。
# 参考
上次更新: 2024/06/29, 15:13:44