Spring中@Autowired與@Resource的區別詳析

一、定義

  • @Autowired

對類成員變量、方法及構造函數進行標註,完成自動裝配的工作。

  • @Resource

在語義上被定義為通過其唯一的名稱來標識特定的目標組件,其中聲明的類型與匹配過程無關。

如果沒有明確指定名稱,則默認名稱是從字段名稱或設置方法(get、set方法)派生的。 如果用在字段上,則采用字段名稱; 如果用在在setter方法,它采用其屬性名稱(例如setProperty()方法,取property做為屬性名稱)。

二、區別

在Spring框架中,如果在Service層中需要註入其他依賴的對象,通常我們都會使用@Autowired或者@Resource註解,但是它們是有區別的,比如@Autowired跟Spring框架強耦合瞭, 如果換成其他框架,@Autowired就沒作用瞭。而@Resource是JSR-250提供的,它是Java標準,絕大部分框架都支持。

接下來,我們總結一下@Autowired和@Resource的區別:

(一)、包含的屬性不同

@Autowired隻包含一個參數:required,表示是否開啟自動註入,默認是true。而@Resource包含七個參數,其中最重要的兩個參數是:name 和 type。如下:

public @interface Autowired {
 
    /**
     * 是否開啟自動註入,有些時候我們不想使用自動裝配功能,可以將該參數設置成false。
     */
	boolean required() default true;
 
}
 
 
public @interface Resource {
    /**
     * bean的名稱
     */
    String name() default "";
 
    String lookup() default "";
 
    /**
     * Java類,被解析為bean的類型
     */
    Class<?> type() default java.lang.Object.class;
 
    enum AuthenticationType {
            CONTAINER,
            APPLICATION
    }
 
    /**
     * 身份驗證類型
     */
    AuthenticationType authenticationType() default AuthenticationType.CONTAINER;
 
    /**
     * 組件是否可以與其他組件之間共享
     */
    boolean shareable() default true;
 
    String mappedName() default "";
 
    /**
     * 描述
     */
    String description() default "";
}

(二)、@Autowired默認按byType自動裝配,而@Resource默認byName自動裝配。

@Autowired如果要使用byName,需要使用@Qualifier一起配合。而@Resource如果指定瞭name,則用byName自動裝配,如果指定瞭type,則用byType自動裝配。

(三)、註解應用的地方不同

@Autowired能夠用在:構造器、方法、參數、成員變量和註解上,而@Resource能用在:類、成員變量和方法上。

(四)、出處不同

@Autowired是Spring定義的註解,而@Resource是JSR-250定義的註解。所以@Autowired隻能在Spring框架下使用,而@Resource則可以與其他框架一起使用。

(五)、裝配順序不同

@Autowired的裝配順序如下:

@Autowired默認先按byType進行匹配,如果發現找到多個bean,則又按照byName方式進行匹配,如果還有多個,則報出異常。

@Resource的裝配順序如下:

如果同時指定瞭name和type,流程如下:

如果指定瞭name,流程如下:

隻是指定瞭@Resource註解的name,則按name後的名字去bean元素裡查找有與之相等的name屬性的bean。

 如果指定瞭type,流程如下:

隻指定@Resource註解的type屬性,則從上下文中找到類型匹配的唯一bean進行裝配,找不到或者找到多個,都會拋出異常。

如果既沒有指定name,也沒有指定type,流程如下:

既不指定name屬性,也不指定type屬性,則自動按byName方式進行查找。如果沒有找到符合的bean,則回退為一個原始類型進行進行查找,如果找到就註入。

總結

到此這篇關於Spring中@Autowired與@Resource區別的文章就介紹到這瞭,更多相關Spring中@Autowired與@Resource區別內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: