我在项目中遇到了一个循环依赖的小问题,发现在字段/设置器上使用@Autowired
可以解决此问题,而不是在构造函数上使用@Autowired
。这种行为的结论是,在字段/ setter注入的情况下,Spring注入代理,而在构造函数注入的情况下,则注入实际bean。
问题: 这背后的原因是什么?为什么要注入不同的实体?
考虑简单的代码段:
@Component
public static class A{
@Autowired B b;
@Autowired C c;
}
@Component
public static class B{
@Autowired B b;
@Autowired C c;
// public B(C c,B b) { // this would cause circular dep problem
// this.c=c;
// }
}
@Component
public static class C{
@Autowired A a;
@Autowired B b;
}
我想到的一个想法是,通过构造函数注入,您可以立即使用注入的实体,因此,在注入预先初始化的Bean而不是代理时,我可以这样做, setter方法的情况下,使接缝无效。
答案 0 :(得分:1)
因此,在使用构造函数注入时,必须更早创建构造函数中使用的所有bean。如果您有循环依赖项,则由于此循环依赖项和spring throw异常而无法创建它们。
在使用setter / field注入时,在创建bean之后设置了注入元素,因此允许圆弧形鱼眼。
顺便说一句,如果您有循环依赖关系,请尝试重新设计应用程序,因为您的代码将很难维护。这是应该优先选择构造函数注入的原因之一。