Spring 是否解决多例 Bean 的循环依赖¶
一、结论¶
不解决。
二、为什么¶
多例(prototype)Bean 每次 getBean 都新建一个,不缓存。
三、问题¶
创建 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¶
注入代理,第一次用才真正创建。
3. 实现 BeanFactoryAware¶
class A implements BeanFactoryAware {
private BeanFactory factory;
public B getB() { return factory.getBean(B.class); }
}
六、报错¶
一句话
多例不缓存,循环依赖死循环。Spring 不解决,要自己改设计。