1. 程式人生 > 實用技巧 >@Autowired 與@Resource的區別

@Autowired 與@Resource的區別

前言

面試被這兩個註解整懵逼了。。。。。。。。。。。且看文筆君接下來解析

@Resource

@Resource (建議用 這個注解屬於J2EE的)

類全稱: javax.annotation.Resource

預設注入方式: byName(反射機制)

指定注入方式:

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

@Autowired

@Autowired (這個註解是屬業spring的)

類全稱: org.springframework.beans.factory.annotation.Autowired

預設注入方式: byType

Bean查詢規則:

a)預設是要物件必須存在的, 如果允許物件為null, 則要設定required= false

   b)如果是根據型別查詢, 有多個相同型別(is-a)的實現類,那麼會丟擲異常 , 此時需要加上@Qualifier("hello")註解指定注入的Bean的標識名稱(不一定特指id或者name,就是指的@Service("thisTarget")中的thisTarget這個值,也不排除沒有這個值自動查詢其id或者name的可能性), 則按照標識名稱去查詢,若有多個相同名稱的Bean,則丟擲異常.

@Autowired 與@Resource的區別

1、@Resource的作用相當於@Autowired,只不過@Autowired按byType自動注入,而@Resource預設按 byName自動注入罷了。@Resource有兩個屬性是比較重要的,分是name和type,Spring將@Resource註解的name屬性解析為bean的名字,而type屬性則解析為bean的型別。所以如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byName自動注入策略

2、@Autowired預設按型別裝配

(這個註解是屬業spring的),預設情況下必須要求依賴物件必須存在,如果要允許null值,可以設定它的required屬性為false,如:@Autowired(required=false) ,如果我們想使用名稱裝配可以結合@Qualifier註解進行使用,如下:

    @Autowired()@Qualifier("baseDao")

    privateBaseDao baseDao;

總結:

@Autowired//預設按type注
@Qualifier("cusInfoService")//一般作為@Autowired()的修飾用
@Resource(name="cusInfoService")//預設按name注入,可以通過name和type屬性進行選擇性注入

一般@Autowired和@Qualifier一起用,@Resource單獨用。

當然沒有衝突的話@Autowired也可以單獨用

@Autowired 和 @Qualifier 結合使用時,自動注入的策略就從 byType 轉變成 byName 了。 等價於 @Resource

注意:@Autowired 有時候會出現警告

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