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会抛出异常,而不是 知道使用哪三个构造函数。但代码运行得很好。
那么,这有什么用呢?为什么这段代码有效?什么是错误的情况 在上述陈述中提到了什么?
答案 0 :(得分:5)
我认为这可能是作者最了解的:-),但我会分享我的看法以及我对它的理解。
他说&#34; 春天不会尝试猜测&#34;意思是Spring不会只使用Math.random()
并随机获得三个构造函数中的一个,因为所有匹配。这意味着Spring遵循一条规则,它是预先确定的和确定性的(在同一测试的多次尝试中,将会有相同的输出)。
查看AutowiredAnnotationBeanPostProcessor
&#39; s Javadoc:
如果多个非必需构造函数带有注释,则它们将被视为自动装配的候选者。将选择具有最大数量依赖关系的构造函数,这些构造函数可以通过匹配Spring容器中的bean来满足。
因此,如果所有三个构造函数匹配(在测试中发生),那么参数最多的构造函数匹配获胜。