2

在具有 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>

有谁知道一种方法?

4

1 回答 1

4

尝试这个:

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

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

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

编辑:为此,Interface除了需要自动装配的bean之外,其他类型的bean(构造函数arg类型)应该用autowire-candidate=false

例子:

<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。第一个参数是在 Spring 配置中手动提供的。

于 2014-07-24T11:31:55.743 回答