@Resource 和 @Autowired 註解的區別

@Autowird

@Autowird 屬於spring框架,默認使用類型(byType)進行注入,例如下面代碼:

@Autowired   
public IUserService userService  

系統會根據IUserService接口進行注入,如果這個接口只有一個實現類,那麼會正常注入,如果有多個實現類,他會報錯,如果沒有實現類,它也會報錯。可以對這個問題進行限定,如下面的代碼:

@Autowired(required = false)   
public IUserService userService  

如果找不到對應的bean時候,不會拋出錯誤,如果required = true,當不存在bean時候,就會拋出異常

可以使用 @Qualifier 配合 @Autowird 使用,@Autowired 和 @Qualifier 結合使用時,自動注入的策略就從 byType 轉變成 byName。 如下面代碼

@Autowired   
@Qualifier("userServiceImpl")   
public IUserService userService;  
// 或者
@Autowired   
public void setUserDao(@Qualifier("userDao") UserDao userDao) {   
    this.userDao = userDao;   
}  

這樣spring會根據@Qualifier指定的id進行注入(依據ID查詢對應的bean)


 

@Resource

@Resource是JavaEE自帶的註解,根據ID進行注入的。@Resource的作用相當於@Autowired,只不過@Autowired按byType自動注入,而@Resource默認按byName自動注入罷了。

@Resource有兩個屬性是比較重要的,分是name和type,Spring將@Resource註解的name屬性解析爲bean的名字,而type屬性則解析爲bean的類型。所以如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byName自動注入策略。

@Resource裝配順序

  1. 如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則拋出異常

  2. 如果指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常

  3. 如果指定了type,則從上下文中找到類型匹配的唯一bean進行裝配,找不到或者找到多個,都會拋出異常

  4. 如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退爲一個原始類型進行匹配

 

總結

  • @Autowired註解是按類型裝配依賴對象,默認情況下它要求依賴對象必須存在,如果允許null值,可以設置它required屬性爲false。

  • @Resource 註解和 @Autowired 一樣,也可以標註在字段或屬性的setter方法上,但它默認按名稱裝配。名稱可以通過@Resource的name屬性指定,如果沒有指定name屬性,當註解標註在字段上,即默認取字段的名稱作爲bean名稱尋找依賴對象,當註解標註在屬性的setter方法上,即默認取屬性名作爲bean名稱尋找依賴對象。

  • @Resources按名字裝配對象,是 JDK 自帶的;而@Autowired按類型裝配對象,是 Spring 框架的。

 

參考地址

發佈了159 篇原創文章 · 獲贊 28 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章