@Resource和@Autowired的區別與理解

以下內容首發於我的個人博客網站:
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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章