1. 程式人生 > >Spring的 @Autowired註解的詳細解釋

Spring的 @Autowired註解的詳細解釋

使用 @Autowired 註解進行裝配,只能是根據型別進行匹配。@Autowired 註解可以用於 Setter 方法、建構函式、欄位,甚至普通方法,前提是方法必須有至少一個引數。@Autowired 可以用於陣列和使用泛型的集合型別。然後 Spring 會將容器中所有型別符合的 Bean 注入進來。@Autowired 標註作用於 Map 型別時,如果 Map 的 key 為 String 型別,則 Spring 會將容器中所有型別符合 Map 的 value 對應的型別的 Bean 增加進來,用 Bean 的 id 或 name 作為 Map 的 key。

@Autowired 標註作用於普通方法時,會產生一個副作用,就是在容器初始化該 Bean 例項的時候就會呼叫該方法。當然,前提是執行了自動裝配,對於不滿足裝配條件的情況,該方法也不會被執行。

當標註了 @Autowired 後,自動注入不能滿足,則會丟擲異常。我們可以給 @Autowired 標註增加一個 required=false 屬性,以改變這個行為。另外,每一個類中只能有一個建構函式的 @Autowired.required() 屬性為 true。否則就出問題了。如果用 @Autowired 同時標註了多個建構函式,那麼,Spring 將採用貪心演算法匹配建構函式 ( 建構函式最長 )。

@Autowired 還有一個作用就是,如果將其標註在 BeanFactory 型別、ApplicationContext 型別、ResourceLoader 型別、ApplicationEventPublisher 型別、MessageSource 型別上,那麼 Spring 會自動注入這些實現類的例項,不需要額外的操作。

@Autowired(required=false) 
 @Qualifier("ppp") 
 public void setPerson(person p){}

@Qualifier 甚至可以作用於方法的引數 ( 對於方法只有一個引數的情況,我們可以將 @Qualifer 標註放置在方法宣告上面,但是推薦放置在引數前面 ),舉例如下:

@Autowired(required=false) 
 public void sayHello(@Qualifier("ppp")Person p,String name){}
我們可以在配置檔案中指定某個 Bean 的 qualifier 名字,方法如下:
 <bean id="person"
class="footmark.spring.Person"> <qualifier value="ppp"/> </bean>

如果沒有明確指定 Bean 的 qualifier 名字,那麼預設名字就是 Bean 的名字。通常,qualifier 應該是有業務含義的,例如 "domain","persistent" 等,而不應該是類似 "person" 方式。

我們還可以將 @Qualifier 標註在集合型別上,那麼所有 qualifier 名字與指定值相同的 Bean 都將被注入進來。

<bean class="footmark.HelloWorld"> 
 <qualifier type="MovieQualifier"> 
 <attribute key="format" value="VHS"/> 
 <attribute key="genre" value="Comedy"/> 
 </qualifier> 
 </bean> 
 <bean class="footmark.HelloWorld"> 
 <meta key="format" value="DVD"/> 
 <meta key="genre" value="Action"/> 
 </bean>

@Autowired 註解對應的後處理註冊與前面相似,只需在配置檔案中增加如下一行即可:

<context:annotation-config/>

@Autowired預設按型別裝配,預設情況下必須要求依賴物件必須存在,如果要允許null值,可以設定它的required屬性為false,例如:@Autowired(required=false)