1. 程式人生 > >spring的@Autowired 和 @Resource 兩種註解的區別

spring的@Autowired 和 @Resource 兩種註解的區別

      在面試的時候,面試官問我@Autowired 和 @Resource 兩種註解的區別,當時懵逼了,雖然是經常用,但具體區別還真是不知道。然後搜百度記錄下。。。

一、相同點

    1. 都是用來裝配 Bean,都可以寫在欄位上,或者寫在 setter 方法上。

二、不同點

     @Autowired是Spring提供的註解,需要匯入包org.springframework.beans.factory.annotation.Autowired。

  1. 預設按型別(byType)裝配,Spring會去配置檔案中尋找class為StudentDao的bean。

@Autowired
StudentDao studentDao;

  2. 預設情況下必須要求物件存在,如果允許 Null 值,可是設定 requried 屬性為 false 。如下:

@Autowired(required = false) 

      3. 如果想改為按名稱匹配,需要結合 @Qualifier 註解使用。如下:

@Autowired
@Qualifier("studentDao")
private StudentDao studentDao;

     @Resource屬於JDK1.6支援的註解,需要匯入包javax.annotation.Resource,但Spring支援該註解實現依賴注入,預設按byName注入。

  1. 預設按照名稱裝配,且預設按欄位名查詢。

  2. 如指定 name 屬性,則按照指定的 name 值查詢。如下:

//兩種方法只選擇一種
@Resource("studentDao")
private StudentDao studentDao;

//用於屬性的setter方法上
@Resource("studentDao")
public void setStudentDao(StudentDao studentDao) {
            this.studentDao = studentDao;

}

     3. 在不指定 name 值的前提下,按名稱搜不到匹配的 bean 時,會自動改為按型別匹配

    @Resource說明

     預設安裝名稱進行裝配,名稱可以通過name屬性進行指定,如果沒有指定name屬性,當註解寫在欄位上時,預設取欄位名進行安裝名稱查詢,如果註解寫在setter方法上預設取屬性名進行裝配。當找不到與名稱匹配的bean時才按照型別進行裝配。但是需要注意的是,如果name屬性一旦指定,就只會按照名稱進行裝配。
 

   @Resource裝配順序:

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

  ②如果指定了name,則從上下文中查詢名稱(id)匹配的bean進行裝配,找不到則丟擲異常。

  ③如果指定了type,則從上下文中找到類似匹配的唯一bean進行裝配,找不到或是找到多個,都會丟擲異常。

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