尝试这个:
<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 配置中手动提供的。