在构造函数中自动装配单个参数

时间:2014-07-24 11:19:44

标签: java spring spring-bean

在一个带有2个参数的构造函数中,我想明确连接一个并自动连接另一个。

类似的东西:

public Obj(Interface arg, Interface arg2) {
    // stuff
}

在bean定义中:

<bean id="objImpl" class="com.work.Obj">
    <constructor-arg index="0" ref="interfaceImpl"/>
    <constructor-arg index="1" autowire-this-somehow/>
</bean>

有人知道某种方式吗?

1 个答案:

答案 0 :(得分:4)

试试这个:

<bean id="objImpl" class="com.work.Obj" autowire="constructor">
    <constructor-arg index="0" ref="interfaceImpl"/>
</bean>

在这里,您已指定使用构造函数自动装配创建类型为com.work.Obj的bean。如果指定任何构造函数arg,则它将覆盖自动装配的arg。因此明确提供了索引0。未明确提供的其他args将按类型自动装配。

警告:构造函数自动装配与byType具有相同的限制 - 当Spring找到与构造函数arg匹配的多个bean时,Spring不会尝试猜测哪个bean要自动装配。此外,如果类具有多个构造函数,其中任何一个都可以通过自动装配来满足,那么Spring将不会尝试猜测要使用哪个构造函数。在这种情况下你会得到一个例外。

编辑:为了使其正常工作,其他类型为Interface的bean(构造函数arg类型)除了需要自动装配的bean之外,应标记为autowire-candidate=false < / p>

示例:

<bean id="impl1" class="stackoverflow.SomeImpl" autowire-candidate="false"/>
<bean id="impl2" class="stackoverflow.SomeImpl"/>

<bean id="obj" class="stackoverflow.Obj" autowire="constructor">
    <constructor-arg index="0" ref="impl1"/>
</bean>

和Obj班:

package stackoverflow;

public class Obj {
    public Obj(SomeInterface i1, SomeInterface i2){
        System.out.println("i1" + i1);
        System.out.println("i2" + i2);
    }
}

此处SomeImpl implements SomeInterface。在运行impl2时,bean会在第二个构造函数arg i2中自动装配。第一个arg是在Spring config中手动提供的。