Spring中@Autowired與@Resource的區(qū)別詳析
一、定義
- @Autowired
對類成員變量、方法及構(gòu)造函數(shù)進行標注,完成自動裝配的工作。
- @Resource
在語義上被定義為通過其唯一的名稱來標識特定的目標組件,其中聲明的類型與匹配過程無關(guān)。
如果沒有明確指定名稱,則默認名稱是從字段名稱或設(shè)置方法(get、set方法)派生的。 如果用在字段上,則采用字段名稱; 如果用在在setter方法,它采用其屬性名稱(例如setProperty()方法,取property做為屬性名稱)。
二、區(qū)別
在Spring框架中,如果在Service層中需要注入其他依賴的對象,通常我們都會使用@Autowired或者@Resource注解,但是它們是有區(qū)別的,比如@Autowired跟Spring框架強耦合了, 如果換成其他框架,@Autowired就沒作用了。而@Resource是JSR-250提供的,它是Java標準,絕大部分框架都支持。
接下來,我們總結(jié)一下@Autowired和@Resource的區(qū)別:
(一)、包含的屬性不同
@Autowired只包含一個參數(shù):required,表示是否開啟自動注入,默認是true。而@Resource包含七個參數(shù),其中最重要的兩個參數(shù)是:name 和 type。如下:
public @interface Autowired { /** * 是否開啟自動注入,有些時候我們不想使用自動裝配功能,可以將該參數(shù)設(shè)置成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自動裝配。
(三)、注解應(yīng)用的地方不同
@Autowired能夠用在:構(gòu)造器、方法、參數(shù)、成員變量和注解上,而@Resource能用在:類、成員變量和方法上。
(四)、出處不同
@Autowired是Spring定義的注解,而@Resource是JSR-250定義的注解。所以@Autowired只能在Spring框架下使用,而@Resource則可以與其他框架一起使用。
(五)、裝配順序不同
@Autowired的裝配順序如下:
@Autowired默認先按byType進行匹配,如果發(fā)現(xiàn)找到多個bean,則又按照byName方式進行匹配,如果還有多個,則報出異常。
@Resource的裝配順序如下:
如果同時指定了name和type,流程如下:
如果指定了name,流程如下:
只是指定了@Resource注解的name,則按name后的名字去bean元素里查找有與之相等的name屬性的bean。
如果指定了type,流程如下:
只指定@Resource注解的type屬性,則從上下文中找到類型匹配的唯一bean進行裝配,找不到或者找到多個,都會拋出異常。
如果既沒有指定name,也沒有指定type,流程如下:
既不指定name屬性,也不指定type屬性,則自動按byName方式進行查找。如果沒有找到符合的bean,則回退為一個原始類型進行進行查找,如果找到就注入。
總結(jié)
到此這篇關(guān)于Spring中@Autowired與@Resource區(qū)別的文章就介紹到這了,更多相關(guān)Spring中@Autowired與@Resource區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入淺析springboot中static和templates區(qū)別
這篇文章主要介紹了springboot中static和templates區(qū)別,本文通過圖文實例代碼相結(jié)合給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02JavaWeb利用struts實現(xiàn)文件下載時改變文件名稱
這篇文章主要為大家詳細介紹了JavaWeb利用struts實現(xiàn)文件下載時改變文件名稱的相關(guān)資料,需要的朋友可以參考下2016-06-06Springboot與vue實例講解實現(xiàn)前后端分離的人事管理系統(tǒng)
這篇文章主要介紹了如何用Java實現(xiàn)企業(yè)人事管理系統(tǒng),文中采用springboot+vue實現(xiàn)前后端分離,感興趣的小伙伴可以學習一下2022-06-06