天天看點

Spring中 @Autowired标簽與 @Resource标簽 的差別

spring不但支援自己定義的@autowired注解,還支援由jsr-250規範定義的幾個注解,如:@resource、 @postconstruct及@predestroy。

1. @autowired

    @autowired是spring 提供的,需導入

    package:org.springframework.beans.factory.annotation.autowired;

    隻按照bytype 注入。

2. @resource

    @resource預設按 byname 自動注入,是j2ee提供的, 需導入package:  

    javax.annotation.resource;

    @resource有兩個中重要的屬性:name和type ,而spring将@resource注解的name屬性解析為bean的

    名字,而type屬性則解析為bean的類型。是以如果使用name屬性,則使用byname的自動注入政策,而使用

    type屬性時則使用 bytype自動注入政策。如果既不指定name也不指定type屬性,這時将通過反射機制使用by

    name自動注入政策。

    @resource裝配順序 

  (1). 如果同時指定了name和type,則從spring上下文中找到唯一比對的bean進行裝配,找不到則抛出異常;

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

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

  (4). 如果既沒有指定name,又沒有指定type,則自動按照byname方式進行裝配;如果沒有比對,則回退為一

    個原始類型進行比對,如果比對則自動裝配;

    @resource的作用相當于@autowired,隻不過@autowired按bytype自動注入。

3. 使用差別

    @resource(name="loginservice") 

    private loginservice loginservice;

    @autowired(required=false)@qualifier("loginservice") 

   (1).@autowired 與@resource都可以用來裝配bean. 都可以寫在字段上,或寫在setter方法上;

   (2).@autowired 預設按類型裝配,預設情況下必須要求依賴對象必須存在,如果要允許null值,可以設

    置它的required屬性為false,如:@autowired(required=false) .

如果我們想使用名稱裝配可以結合 @qualifier注解進行使用;

    (3).@resource(這個注解屬于j2ee的),預設安裝名稱進行裝配,名稱可以通過name屬性進行指定,如果沒

    有指定name屬性,當注解寫在字段上時,預設取字段名進行安裝名稱查找,如果注解寫在setter方法上預設取屬

    性名進行裝配。當找不到與名稱比對的bean時才按照類型進行裝 配。但是需要注意的是,如果name屬性一旦指

    定,就隻會按照名稱進行裝配。

    推薦使用@resource注解在字段上,這樣就不用寫setter方法了.并且這個注解是屬于j2ee的,減少了與spring

    的耦合,這樣代碼看起就比較優雅 。

另外,通過實踐,還總結出一條規律:

如果将@requied或者@autowired寫了set方法之上,則程式會走到set方法内部。

但如果寫在了field之上,則不會進入set方法當中。