2014-07-24 36 views
1

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

什么阻止你使用ref? – hutingung

+2

为什么不自动连接另一个呢? –

+0

我不想在这个问题中想到这个问题,因为它太长了。所以我只是说,因为遗留项目代码,因为糟糕的设计,嘘嘘bla ... – Simeon

回答

4

试试这个:

<bean id="objImpl" class="com.work.Obj" autowire="constructor"> 
    <constructor-arg index="0" ref="interfaceImpl"/> 
</bean> 

在这里,你已经指定了com.work.Obj类型的bean应当使用创建的自动装配构造。如果您指定了任何构造函数arg,那么它将覆盖自动装配参数。所以索引0是明确提供的。其他未明确提供的参数将按类型自动布线。

注意:构造自动装配有相同的限制,byType - 春天不会试图去猜测当它找到匹配的构造精氨酸,多种bean自动装配哪个Bean。此外,如果类有多个构造函数,其中任何一个都可以通过自动装配来满足,那么Spring将不会尝试猜测使用哪个构造函数。在这种情况下你会得到一个例外。

编辑:对于这项工作,类型Interface(构造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配置中手动提供的。

+0

你怎么autowire第二参数,当它有两个可能的值时:'interfaceImpl'(已经用于第一个参数的值)和'someOtherInterfaceImpl'? –

+1

@AndreiStefan正如我所提到的那样'当Spring发现多个与构造函数arg'相匹配的bean时,Spring将不会尝试猜测自动装入哪个bean。您将得到一个异常。如果你愿意,你可以在那些你确定不需要自动装配的bean上设置'autowire-candidate = false'。 – Pat

+0

我知道,这就是为什么我要求指出你提供的解决方案实际上不是解决方案。随着你的代码,将会有一个例外。 –