跳转至

Spring 是否解决构造器循环依赖

一、结论

不解决

二、场景

class A {
    public A(B b) {}
}
class B {
    public B(A a) {}
}

三、为什么

构造器循环依赖: 1. 创建 A,需要 B。 2. 创建 B,需要 A。 3. A 还没实例化完(构造函数没执行完)。 4. 死锁。

四、为什么三级缓存没用

三级缓存是在实例化后(构造函数执行完)才暴露早期引用。

构造器循环依赖: - 构造函数没执行完,对象还没创建。 - 没法放三级缓存。 - 死锁。

五、怎么解决

1. 改 setter 注入

class A {
    @Autowired public void setB(B b) {}
}

setter 注入在实例化后,三级缓存能解决。

2. 用 @Lazy

class A {
    public A(@Lazy B b) {}
}

注入代理,第一次用才真正创建。

3. 重新设计

循环依赖是设计问题,尽量重构。

六、报错

BeanCurrentlyInCreationException: Requested bean is currently in creation

七、Spring Boot 2.6+

默认禁止循环依赖,要开:

spring:
  main:
    allow-circular-references: true

一句话

构造器循环依赖 = 对象还没创建就需要对方,无解。改 setter 或 @Lazy。