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

dsp*_*ynm 5 spring constructor autowired constructor-injection spring-3

春季版是3.2

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

构造函数自动装配与byType共享相同的限制.当Spring找到多个与构造函数的参数匹配的bean时,它不会尝试猜测哪个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" />
Run Code Online (Sandbox Code Playgroud)

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...

}
Run Code Online (Sandbox Code Playgroud)

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

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

据我所知,在尝试实例化dependentBeanAutowiredByConstructor时,Spring会抛出异常,而不知道要使用哪三个构造函数.但代码运行得很好.

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

And*_*fan 5

我认为这可能是作者最了解的东西:-),但我将分享我如何看待它以及我如何理解它.

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

AutowiredAnnotationBeanPostProcessorJavadoc中:

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

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