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

时间:2019-01-23 07:52:39

标签: java spring

我在项目中遇到了一个循环依赖的小问题,发现在字段/设置器上使用@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方法的情况下,使接缝无效。

1 个答案:

答案 0 :(得分:1)

因此,在使用构造函数注入时,必须更早创建构造函数中使用的所有bean。如果您有循环依赖项,则由于此循环依赖项和spring throw异常而无法创建它们。

在使用setter / field注入时,在创建bean之后设置了注入元素,因此允许圆弧形鱼眼。

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