以下內容首發於我的個人博客網站:
http://riun.xyz
@Resource
和@Autowired
的區別:
**相同點:**均可標註在字段或屬性的setter方法上,表示向其注入一個對象
不同點:
-
提供方:
@Autowired
是由org.springframework.beans.factory.annotation.Autowired
提供,換句話說就是由Spring提供;@Resource
是由javax.annotation.Resource
提供,即J2EE提供,需要JDK1.6及以上。 -
注入方式:
@Autowired
只按照類型注入,將相同類型的類的對象注入到這個變量中,如果想按名稱注入需要結合其他註解;@Resource
按照名稱注入,也支持按照類型注入。 -
特點:
@Autowired
按類型裝配依賴對象,默認情況下它要求依賴對象必須存在。如果啓動Spring時未在application上下文中找到此對象,那麼將報錯無法注入。要避免此情況,必須設置@Autowired(required = false)
。如果我們想按名稱裝配,必須結合@Qualifier
註解一起使用:@Autowired() @Qualifier("name")
。
@Resource
有兩個中重要的屬性:name和type。name屬性指定byName,如果沒有指定name屬性,當註解標註在字段上時,就默認取字段名稱作爲bean名稱尋找依賴對象;當註解標註在屬性的setter方法上,即默認取屬性名作爲bean名稱尋找依賴對象。需要注意的是,@Resource
如果沒有指定name屬性,並且按照默認的名稱仍然找不到依賴對象時,@Resource
註解會回退到按類型裝配。但一旦指定了name屬性,就只能按名稱裝配了。
@Resource
裝配順序
1. 如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則拋出異常
2. 如果指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常
3. 如果指定了type,則從上下文中找到類型匹配的唯一bean進行裝配,找不到或者找到多個,都會拋出異常
4. 如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退爲一個原始類型進行匹配,如果匹配則自動裝配;
推薦使用@Resource
註解在字段上,這樣就不用寫setter方法了.並且這個註解是屬於J2EE的,減少了與Spring的耦合,這樣代碼看起就比較優雅 。
按名稱裝配時不區分大小寫。
小結:
@Autowired
註解默認按照類型裝配,如果允許null值,則可以設置 @Autowired(required=false)
如果想按照名稱裝配,則可以聯合使用 @Qualifier
,例如
@Autowired() @Qualifier("baseDao")
private BaseDao baseDao;
@Resource
註解默認按照名稱裝配,這個名稱可以通過此註解的name屬性指定。若沒有指定,當此註解修飾變量時,默認名稱等於變量名。當找不到指定名稱時,會按照類型進行裝配。
@Resource(name="baseDao")//會去找名稱爲baseDao的Bean進行裝配,若沒有,則找類型爲BaseDao的Bean裝配
private BaseDao baseDao;