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

我在项目中遇到了一个循环依赖的小问题,发现@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 的情况下做同样的事情方法,使接缝无效。


智慧大石
浏览 139回答 1
1回答

慕斯709654

因此,当您使用构造函数注入时,必须更早地创建构造函数中使用的所有 bean。如果您有循环依赖项,则由于此循环依赖项和 spring throw 异常而无法创建它们。当您使用 setter/field injection 注入的元素是在创建 bean 之后设置的,因此允许循环依赖。顺便说一句,如果您有循环依赖项,请尝试重新设计您的应用程序,因为您的代码将更难维护。这是为什么应该首选构造函数注入的原因之一。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python