【问题标题】:Autowire a single argument in a constructor在构造函数中自动装配单个参数
【发布时间】:2014-07-24 11:19:44
【问题描述】:

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

有人知道方法吗?

【问题讨论】:

  • 是什么阻止你使用 ref?
  • 为什么不自动装配另一个呢?
  • 我不想在这个问题中讨论这个问题,因为它会太长。所以我只想说因为遗留项目代码,因为糟糕的设计,bla bla bla ...
  • 我目前需要的是一个肮脏丑陋的黑客,这就是我要的:)

标签: java spring spring-bean


【解决方案1】:

试试这个:

<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(构造函数 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 implements SomeInterface。在运行 impl2 时,bean 在第二个构造函数 arg i2 中自动装配。第一个参数是在 Spring 配置中手动提供的。

【讨论】:

  • 当第二个参数有两个可能的值时,你如何自动连接它:interfaceImpl(第一个参数已经使用的值)和someOtherInterfaceImpl
  • @AndreiStefan 正如我提到的Spring won't attempt to guess which bean to autowire when it finds multiple beans that match a constructor arg 你会得到一个例外。如果需要,您可以在确定不希望自动装配的那些 bean 上设置 autowire-candidate=false
  • 我知道,这就是为什么我要求指出您提供的解决方案实际上并不是解决方案。使用您的代码,会有异常。
  • @AndreiStefan 正如我在上面的评论中提到的那样 - 所有类型为 Interface 的 bean 除了需要自动装配的 bean 都应该标记为 autowire-candidate="false" 以便 Spring 只能选择一个 bean 作为合适的候选人。我知道,这很混乱,但这就是 Simeon 的要求 :)
猜你喜欢
  • 2014-09-29
  • 2020-05-23
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多