为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 Spring 对待构造函数注入与 setter/field 注入不同?

为什么 Spring 对待构造函数注入与 setter/field 注入不同?

智慧大石 2022-05-20 18:27:08
我在项目中遇到了一个循环依赖的小问题,发现@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 之后设置的,因此允许循环依赖。

顺便说一句,如果您有循环依赖项,请尝试重新设计您的应用程序,因为您的代码将更难维护。这是为什么应该首选构造函数注入的原因之一。


查看完整回答
反对 回复 2022-05-20
  • 1 回答
  • 0 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信