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