2013-05-05 170 views
-1

我想我發現了一個令人困惑的問題。 我有包下兩個類 '曹' 一個是:Spring @Autowired令人困惑

@Repository 
public class MovieFinder { 
} 

另一個是:

public class SimpleMovieLister { 

    @SuppressWarnings("SpringJavaAutowiringInspection") 
    @Autowired 
    private MovieFinder movieFinder; 

    public MovieFinder getMovieFinder() { 
     return movieFinder; 
    } 

    public void setMovieFinder(MovieFinder movieFinder) { 
     this.movieFinder = movieFinder; 
    } 
} 

在應用程序的XML文件,我定義如下

<bean class="cao.SimpleMovieLister"/> 
<context:component-scan base-package="cao"/> 
<bean id="1" class="cao.MovieFinder"/> 

然後程序可以正常運行。 但令我困惑的是,現在我們有兩個類型的MovieFinder實例。爲什麼不拋出異常?

將@Repository更改爲@Repository(value =「2」)後,會引發期望的異常。 WOW,請幫助我。 非常感謝。

+0

你是什麼意思「我們有兩個類型MovieFinder的實例」?你期望拋出什麼異常? – 2013-05-05 05:33:13

+0

我的意思是現在我們有兩個來自IoC的實例。一個是通過顯式實例化的實例,另一個是由組件掃描機制。
當面對@ Autowired時,它不應該拋出一個超過1個候選人的例外嗎? – user2351281 2013-05-06 09:30:36

+0

是什麼讓你認爲你有兩個IoC實例?如果不需要,@Autowired不會創建對象。 – 2013-05-06 09:32:16

回答

2

spring documentation:

默認情況下提到的,自動連接失敗時零種候選人豆可

它並不真正關心,如果有超過1點的候選,因爲事實上,你可以將多個候選自動裝入數組/集合中。

似乎只要你有多個候選人,它會自動裝載最後創建的bean - 但是在支持這個的文檔中我找不到任何東西。永遠不要依賴這種行爲。

到目前爲止,我還沒有找到一個方法來配置自動連接失敗,如果有超過1名候選人 - 我想你必須創建自己的BeanPostProcessor和/或覆蓋AutowiredAnnotationBeanPostProcessor

我說最好實踐是避免有多個候選人,要麼提供額外的限定詞,要麼避免創造不必要的候選人。

+0

首先感謝您的長時間評論。但是我想說的是,如果我確定了一個以上的候選人並且這是我正在發生的事情,那麼將會出現錯誤。 – user2351281 2013-05-06 09:25:16

0

但讓我困惑的是,現在我們有兩個 類型的MovieFinder實例。

如果您正在使用annotation based configuration@Repository),那麼你爲什麼配置在XML這個bean第二次<bean id="1" class="cao.MovieFinder"/>?這就是爲什麼你有兩個相同的豆。

+0

我正在學習和練習。也許代碼和配置非常難看。請原諒我。 – user2351281 2013-05-06 09:29:16