2014-07-24 35 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

我知道,這就是爲什麼我要求指出你提供的解決方案實際上不是解決方案。隨着你的代碼,將會有一個例外。 –