2016-07-05 182 views
0

我有一個與Spring註釋相關的問題。在我的(學習)項目中,我定義了兩個類,另一個類有兩個屬性,每個屬性都是其中的一個。 爲了生成錯誤,我在XML中定義了兩個相同類類型的bean,並且我在setter方法中使用了@Autowired註釋。事情是這樣的:Spring名稱註釋

<bean id="classA" class="beans.ClassA"></bean> 
<bean id="otherclassA" class="beans.ClassA"></bean> 
<bean id="classB" class="beans.ClassB"></bean> 
public class UpperClass{ 
    private ClassA classA; 
    private ClassB classB; 

    @Autowired 
    public void setClassA(ClassA classA){this.classA = classA} 
    @Autowired 
    public void setClassB(ClassB classB){this.classB = classB} 

    /* . 
     . 
     . 
    */ 
} 

在主類中,我得到的ApplicationContext這個bean的實例,並打印屬性重寫toString方法,一個簡單的測試內容。 我讀過Spring Autowired註釋按類型查找bean,所以測試應該失敗,因爲定義了兩個ClassA類的bean,但是它起作用。 它也可以使用@Resource註釋而不使用任何名稱。

我正在使用Spring版本4. 我已經將bean的id更改爲與類/ setters名稱不匹配,並且如預期的那樣失敗。

誰能告訴我爲什麼,或者我做錯了什麼? 如果Spring無法通過類型找到bean,Spring是否正在尋找byName?

+0

嘗試更改xml中第一個bean的id並查看會發生什麼。 – Jason

+0

我已經看到,如果更改類而不是bean ID,則必須更改setter參數的名稱以獲取錯誤,您還必須更改setter方法名稱以使其與bean id不匹配。 – jgonzal

回答

0

當有多個bean匹配所需類型時,Spring將查看方法參數名稱以解決歧義。海事組織是非常神奇的,也是避免@Autowired的另一個原因。如果你最終使用(或者不得不處理別人的使用)這個行爲,IntelliJ的Spring插件在搞清楚在一個自動裝配站點實際注入哪個bean會做很好的工作。

+0

「@ Autowired」的建議選擇是什麼? – Andreas

+0

XML配置,當然。清晰度勝過簡潔。 –

+0

@Andreas您可以使用@ Qualifier解決歧義 – hellojava