Spring 是否解决构造器循环依赖¶
一、结论¶
不解决。
二、场景¶
三、为什么¶
构造器循环依赖: 1. 创建 A,需要 B。 2. 创建 B,需要 A。 3. A 还没实例化完(构造函数没执行完)。 4. 死锁。
四、为什么三级缓存没用¶
三级缓存是在实例化后(构造函数执行完)才暴露早期引用。
构造器循环依赖: - 构造函数没执行完,对象还没创建。 - 没法放三级缓存。 - 死锁。
五、怎么解决¶
1. 改 setter 注入¶
setter 注入在实例化后,三级缓存能解决。
2. 用 @Lazy¶
注入代理,第一次用才真正创建。
3. 重新设计¶
循环依赖是设计问题,尽量重构。
六、报错¶
七、Spring Boot 2.6+¶
默认禁止循环依赖,要开:
一句话
构造器循环依赖 = 对象还没创建就需要对方,无解。改 setter 或 @Lazy。