跳转至

Spring 是否解决多例 Bean 的循环依赖

一、结论

不解决

二、为什么

多例(prototype)Bean 每次 getBean 都新建一个,不缓存。

@Scope("prototype")
class A {
    @Autowired B b;
}
@Scope("prototype")
class B {
    @Autowired A a;
}

三、问题

创建 A: 1. new A。 2. 填充属性,需要 B。 3. new B。 4. 填充属性,需要 A。 5. new A(又一个新 A)。 6. ... 无限循环。

四、为什么三级缓存没用

三级缓存只缓存单例。多例不缓存,每次新建,所以: - A1 需要 B1。 - B1 需要 A2。 - A2 需要 B2。 - ... 死循环。

五、怎么解决

1. 改单例

最直接。

2. 用 @Lazy

class A {
    @Lazy @Autowired B b;
}

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

3. 实现 BeanFactoryAware

class A implements BeanFactoryAware {
    private BeanFactory factory;
    public B getB() { return factory.getBean(B.class); }
}

六、报错

BeanCurrentlyInCreationException

一句话

多例不缓存,循环依赖死循环。Spring 不解决,要自己改设计。