我有两个类Test和SampleClassWithMultipleProperty,我的bean定义如下:
<bean name="test" class="Test" autowire="constructor">
</bean>
<bean id="instance1" class="SampleClassWithMultipleProperty">
<constructor-arg type="java.lang.String" value="constructor-arg-1"/>
<constructor-arg type="java.lang.String" value="constructor-arg-2"/>
<constructor-arg type="java.lang.String" value="constructor-arg-3"/>
<constructor-arg type="int" value="4"/>
<constructor-arg type="java.lang.Integer" value="5"/>
</bean>
当我指定任何名称ID时,例如&#34; instance1&#34; &#34; INSTANCE2&#34;&#34; instance3&#34;它有效。
但是当我有另一个相同类型的SampleClassWithMultipleProperty的bean时,如下所示:
<bean id="instance2" class="SampleClassWithMultipleProperty">
<constructor-arg type="java.lang.String" value="constructor-arg-1-ind"/>
<constructor-arg type="java.lang.String" value="constructor-arg-2-ind"/>
<constructor-arg type="java.lang.String" value="constructor-arg-3-ind"/>
<constructor-arg type="int" value="4"/>
<constructor-arg type="java.lang.Integer" value="5"/>
</bean>
容器无法在Test类(具有关系)内初始化SampleClassWithMultipleProperty(名称为sampleClassWithMultipleProperty)的bean实例。
当我从&#34; instance1&#34;更改bean的任何id时,它成功地做到了这一点。 to&#34; sampleClassWithMultipleProperty&#34;或&#34; instance2&#34; to&#34; sampleClassWithMultipleProperty&#34; 。
但为什么它会像这样。我在某处读到构造函数的自动装配类似于autowiring byType。理想情况下它应该匹配bean的类型,即类名。
请在下面找到我的课程:
public class Test {
SampleClassWithMultipleProperty sampleClassWithMultipleProperty;
public Test() {
super();
// TODO Auto-generated constructor stub
}
public Test(SampleClassWithMultipleProperty sampleClassWithMultipleProperty) {
super();
System.out.println("in Test constructor");
this.sampleClassWithMultipleProperty = sampleClassWithMultipleProperty;
}
public SampleClassWithMultipleProperty getSampleClassWithMultipleProperty() {
return sampleClassWithMultipleProperty;
}
public void setSampleClassWithMultipleProperty(
SampleClassWithMultipleProperty sampleClassWithMultipleProperty) {
this.sampleClassWithMultipleProperty = sampleClassWithMultipleProperty;
}
}
public class SampleClassWithMultipleProperty {
private String property1;
private String property2;
private String property3;
private int property4;
private Integer property5;
public SampleClassWithMultipleProperty() {
super();
// TODO Auto-generated constructor stub
}
public SampleClassWithMultipleProperty(String property1, String property2, String property3,
int property4, Integer property5) {
super();
this.property1 = property1;
this.property2 = property2;
this.property3 = property3;
this.property4 = property4;
this.property5 = property5;
}
public String getProperty1() {
return property1;
}
public void setProperty1(String property1) {
this.property1 = property1;
}
public String getProperty2() {
return property2;
}
public void setProperty2(String property2) {
this.property2 = property2;
}
public String getProperty3() {
return property3;
}
public void setProperty3(String property3) {
this.property3 = property3;
}
public int getProperty4() {
return property4;
}
public void setProperty4(int property4) {
this.property4 = property4;
}
public Integer getProperty5() {
return property5;
}
public void setProperty5(Integer property5) {
this.property5 = property5;
}
}
答案 0 :(得分:1)
嗨,我不是春天的专家,但我知道一些内容并做了一些搜索,我想在此基础上回答。
我假设你有id的默认自动装配。您有两个类SampleClassWithMultipleProperty的bean定义。这两者都有资格创建,并可用作测试的构造函数ar。
默认情况下,自动装配扫描并匹配范围内的所有bean定义。如果要排除某些bean定义,使其无法通过自动装配模式注入,则可以使用autowire-candidate
设置为false来执行此操作。
所以你能做的是:
<bean id="instance2" class="SampleClassWithMultipleProperty" autowire-candidate="false">
您也可以选择使用default-autowire-candidates
属性来帮助您。您只需传递一个模式,该模式将用于扫描可能的bean创建候选者。
答案 1 :(得分:1)
你的Test
bean有2个构造函数:一个没有arg构造函数和一个需要SampleClassWithMultipleProperty
实例的构造函数。
当你的类路径中只有一个SampleClassWithMultipleProperty
个实例时,spring将只选择带有SampleClassWithMultipleProperty
的构造函数。
当你有两个SampleClassWithMultipleProperty
时,spring将无法在它们之间进行选择,因此将选择no arg构造函数。
当您更改id
某个与构造函数的参数名称匹配的SampleClassWithMultipleProperty
时,spring将能够在它们之间进行选择并且能够创建你的bean与期望SampleClassWithMultipleProperty
的实例的构造函数。
如果在第二种情况下(2 SampleClassWithMultipleProperty
个bean并且没有匹配参数的名称)你会得到NoUniqueBeanDefinitionException
因为spring不能使用正确的构造函数来构建你的bean。
Spring会自动选择满足最多参数的构造函数。