[英]Please explain me this (ambiguity) behavior of autowiring through constructor in Spring
我首先提供小代码片段,然后我会要求解释。
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"/>
==============================================
OUTPUT:
调用参数化构造函数
这是正常的行为,可以理解
现在,我正在添加一个类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”,就会发生这种情况。
但奇怪的是,输出如下。
OUTPUT:
不调用参数构造函数
但请注意,如果A类中没有指定默认构造函数,则会发生预期的异常。 那么,它是Spring IoC容器的默认行为吗? 如果是的话,那就详细解释一下。
先感谢您。
这个问题也可以在LinkedIn中找到( Spring通过构造函数歧义自动装配 )
如果一个类有多个构造函数,其中任何一个都可以通过自动装配来满足,那么Spring将抛出异常,因为它无法决定自动连接哪个bean。
http://www.studytrails.com/frameworks/spring/spring-auto-wire-constructor.jsp
所以这意味着如果你有多个构造函数,spring需要选择一个。 弹簧是如此聪明,可以选择它可以接线的那个。 所以你只使用B bean它使用带有B参数的构造函数。 如果你有两个B bean,它不能使用这个构造函数,因为它不是唯一的B,所以它回退到默认的构造函数。 你删除这个构造函数就会得到异常。
我试过上面的例子:
A.java
package com.constructor;
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;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public B getB() {
return b;
}
public void setB(B b) {
this.b = b;
}
// getters and setters
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.