Spring 3由构造函数自动装配 - 为什么这段代码有效?

时间:2014-06-20 15:11:12

标签: spring constructor autowired spring-3 constructor-injection

Spring版本是3.2

Spring in Action,第三版,3.1.1。陈述了四种自动装配,

  

构造函数自动装配共享与byType相同的限制。当Spring找到多个与构造函数的参数匹配的bean时,Spring不会尝试猜测哪个bean要自动装配。 此外,如果一个类有多个构造函数,其中任何一个都可以通过自动装配来满足,Spring将不会尝试猜测使用哪个构造函数

最后这句话让我感到困惑。我有以下bean定义:

<bean id="independentBean" class="autowiring.IndependentBean" scope="prototype" />
<bean id="weirdBean" class="autowiring.WeirdBean" scope="prototype" />

<bean id="dependentBeanAutowiredByName" class="autowiring.DependentBean" autowire="byName" />
<bean id="dependentBeanAutowiredByType" class="autowiring.DependentBean" autowire="byType" />
<bean id="dependentBeanAutowiredByConstructor" class="autowiring.DependentBean" autowire="constructor" />

IndependentBean和WeirdBean是空类。

DepentendBean定义如下:

package autowiring;

public class DependentBean {
    private IndependentBean independentBean;
    private IndependentBean anotherBean;
    private WeirdBean weirdBean;

    public DependentBean() {

    }

    public DependentBean(IndependentBean independentBean) {
        super();
        this.independentBean = independentBean;
    }

    public DependentBean(IndependentBean independentBean, IndependentBean anotherBean) {
        super();
        this.independentBean = independentBean;
        this.anotherBean = anotherBean;
    }

    public DependentBean(IndependentBean independentBean, IndependentBean anotherBean, WeirdBean weirdBean) {
        super();
        this.independentBean = independentBean;
        this.anotherBean = anotherBean;
        this.weirdBean = weirdBean;
    }

    // getters and setters for each field...

}

现在让我们以粗体回忆起这句话:

  

此外,如果一个类有多个构造函数,其中任何一个都可以通过自动装配来满足,Spring将不会尝试猜测要使用哪个构造函数。

根据这一点,我原以为,在尝试实例化 dependentBeanAutowiredByConstructor 时,Spring会抛出异常,而不是 知道使用哪三个构造函数。但代码运行得很好。

那么,这有什么用呢?为什么这段代码有效?什么是错误的情况 在上述陈述中提到了什么?

1 个答案:

答案 0 :(得分:5)

我认为这可能是作者最了解的:-),但我会分享我的看法以及我对它的理解。

他说&#34; 春天不会尝试猜测&#34;意思是Spring不会只使用Math.random()并随机获得三个构造函数中的一个,因为所有匹配。这意味着Spring遵循一条规则,它是预先确定的和确定性的(在同一测试的多次尝试中,将会有相同的输出)。

查看AutowiredAnnotationBeanPostProcessor&#39; s Javadoc

  

如果多个非必需构造函数带有注释,则它们将被视为自动装配的候选者。将选择具有最大数量依赖关系的构造函数,这些构造函数可以通过匹配Spring容器中的bean来满足。

因此,如果所有三个构造函数匹配(在测试中发生),那么参数最多的构造函数匹配获胜。