java - 在构造函数中 Autowiring 单个参数

标签 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>

有人知道有什么办法吗?

最佳答案

试试这个:

<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/

相关文章:

java - 限制在用户上下文中运行的应用程序生成的进程。红帽

java - 使用 Jenkins 在构建时修改 web.xml 中的 <display-name>

java - 使用Mockito模拟spring的LocalContainerEntityManagerFactoryBean方法?

java - 通过 Keycloak 保护 Spring Boot 中的单个资源

java - 如何创建 spring bean( "Kafka SINK"bean)以从配置服务器刷新上下文

java - 将对象类型声明为 String

java - ESB 支持的数据库

java - 如何从java中的过程中获取值

Java Spring IOC bean创建值(value)

java - 递归地将属性从一个 bean 复制到另一个(不是同一个类)(包括嵌套 bean)