构造函数

时间:2015-10-01 12:06:58

标签: java spring

我有两个类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;
    }

}

2 个答案:

答案 0 :(得分:1)

嗨,我不是春天的专家,但我知道一些内容并做了一些搜索,我想在此基础上回答。

我假设你有id的默认自动装配。您有两个类SampleClassWithMultipleProperty的bean定义。这两者都有资格创建,并可用作测试的构造函数ar。

默认情况下,自动装配扫描并匹配范围内的所有bean定义。如果要排除某些bean定义,使其无法通过自动装配模式注入,则可以使用autowire-candidate设置为false来执行此操作。 所以你能做的是:

<bean id="instance2" class="SampleClassWithMultipleProperty"  autowire-candidate="false">

您也可以选择使用default-autowire-candidates属性来帮助您。您只需传递一个模式,该模式将用于扫描可能的bean创建候选者。

Reference Link 1
Reference Link 2
Reference Link 3

答案 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会自动选择满足最多参数的构造函数。