@AutoWired和@Resource的區別

1.兩者的匹配方式和所存在的包不同

  • @Resource默認按照名稱方式進行bean匹配,@Autowired只能按照類型方式進行bean匹配
  • @Resource(import javax.annotation.Resource;)是J2EE的註解,@Autowired( import org.springframework.beans.factory.annotation.Autowired;)是Spring的註解

Spring屬於第三方的,J2EE是Java自己的東西。使用@Resource可以減少代碼和Spring之間的耦合。

 

2.@Resource可以指定name和type屬性,@Autowired沒有屬性。

        @Resource裝配順序
  1. 如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則拋出異常
  2. 如果指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常
  3. 如果指定了type,則從上下文中找到類型匹配的唯一bean進行裝配,找不到或者找到多個,都會拋出異常
  4. 如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退爲一個原始類型進行匹配,如果匹配則自動裝配;

        @Autowired若想精確(根據名稱即id)地找到裝配對象,則需和@Qualifier("beanName")聯用

         

問題舉例:如果一個Service層的接口有兩個實現類,則在使用@Autowired由於存在兩個類型相同的impl,Spring容器無法完成IOC注入,所以會拋出異常。

解決方案:此時需要使用@Resource通過指定name屬性去匹配,或者將@Autowired@Qualifier聯用。

參考博文:https://blog.csdn.net/wangzuojia001/article/details/54312074/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章