在一个带有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>
有人知道某种方式吗?
答案 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中手动提供的。