我在项目中遇到了一个循环依赖的小问题,发现@Autowired在字段/设置器上使用可以解决这个问题,而不是@Autowired在构造函数上使用。这种行为的结论是 Spring 在 field/setter 注入的情况下注入代理,在构造函数注入的情况下注入实际的 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 的情况下做同样的事情方法,使接缝无效。
1 回答
慕斯709654
TA贡献1840条经验 获得超5个赞
因此,当您使用构造函数注入时,必须更早地创建构造函数中使用的所有 bean。如果您有循环依赖项,则由于此循环依赖项和 spring throw 异常而无法创建它们。
当您使用 setter/field injection 注入的元素是在创建 bean 之后设置的,因此允许循环依赖。
顺便说一句,如果您有循环依赖项,请尝试重新设计您的应用程序,因为您的代码将更难维护。这是为什么应该首选构造函数注入的原因之一。
添加回答
举报
0/150
提交
取消