我先提供小代码片段,然后我会要求解释。
public class A {
private String msg;
private B b;
public A () {
System.out.println("No argument constructor is called");
}
public A (B b) {
System.out.println("Parameterized constructor is called");
this.b = b;
}
// getters and setters
}
===============================================
<bean id="a" class="A" p:msg="hello" autowire="constructor"/>
<bean id="b" class="B"/>
===============================================
输出:
参数化构造函数被调用
这是正常行为,可以理解
===============================================
现在,我正在添加 B 类的新 bean 定义,如下所示。
<bean id="a" class="A" p:msg="hello" autowire="constructor"/>
<bean id="b" class="B"/>
<bean id="c" class="B"/>
所以,据我所知,由于通过构造函数在内部使用'byType'进行自动装配,因此它会给出一个关于bean唯一性违规的异常,例如,如果我使用autowire =“byType”,就会发生这种情况。
但奇怪的是,输出如下所示。
输出:
不调用参数构造函数
=========================================
但是,请注意,如果没有在类 A 中指定默认构造函数,则会发生预期的异常。那么,这是 Spring IoC 容器的默认行为吗?如果是,请详细解释一下。
先感谢您。
LinkedIn 中也有这个问题(Spring autowiring through constructor ambiguity)