在具有 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>
有人知道有什么办法吗?
最佳答案
试试这个:
<bean id="objImpl" class="com.work.Obj" autowire="constructor">
<constructor-arg index="0" ref="interfaceImpl"/>
</bean>
在这里,您已指定应使用构造函数 Autowiring 创建 com.work.Obj
类型的 bean。如果您指定任何构造函数参数,那么它将覆盖 Autowiring 的参数。因此明确提供了索引 0。其他未明确提供的参数将按类型 Autowiring 。
警告:构造函数 Autowiring 与 byType
具有相同的限制 - 当 Spring 发现多个与构造函数参数匹配的 bean 时,它不会尝试猜测要 Autowiring 哪个 bean。此外,如果该类有多个构造函数,其中任何一个都可以通过 Autowiring 来满足,那么 Spring 不会尝试猜测要使用哪个构造函数。在这种情况下,您将得到一个异常(exception)。
编辑:为此,除了需要 Autowiring 的bean之外,其他类型为Interface
(构造函数arg类型)的bean都应该标记为 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实现了SomeInterface
。运行时,impl2
bean 会在第二个构造函数 arg i2
中 Autowiring 。第一个参数是在 Spring 配置中手动提供的。
关于java - 在构造函数中 Autowiring 单个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24932256/