Springboot @Autowired和@Resource的區(qū)別解析
【一】定義
@Resource 和@Autowired 這兩個注解的作用都是在Spring 生態(tài)里面去實現(xiàn)Bean 的依賴注入。
【1】@Autowired
對類成員變量、方法和構(gòu)造函數(shù)進(jìn)行標(biāo)注,完成自動裝配的工作
【2】@Resource
在語義上被定義為通過唯一的名稱來標(biāo)識特定的目標(biāo)組件,其中聲明的類型與匹配過程無關(guān)
【二】區(qū)別
在spring框架中,如果在service層需要注入其他依賴的對象,通常我們都會使用@Autowired或者@Resource注解。@Autowired跟Spring框架強(qiáng)耦合了,如果換成其他的框架,@Autowired就沒有作用了,而@Resource是JSR-250提供的,它是Java標(biāo)準(zhǔn),絕大部分框架都支持
【1】包含的屬性不同
(1)@Autowired只包含一個參數(shù):required,表示是否開啟自動注入,默認(rèn)是true。
(2)@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 ""; }
【2】@Autowired默認(rèn)按byType自動裝配,而@Resource默認(rèn)byName自動裝配
@Autowired如果要使用byName,需要使用@Qualifier一起配合,而@Resource如果指定了name,則用byName自動裝配,如果指定了type,則用byType自動裝配
【3】注解應(yīng)用的地方不同
@Autowired能夠用在:構(gòu)造器、方法、參數(shù)、成員變量和注解上,二@Resource能用在:類、成員變量、方法上
【4】出處不同
@Autowired是Spring定義的注解,而@Resource是JSR-250定義的注解,所以@Autowired只能在spring框架下使用,而@Resource則可以和其他框架一起使用
【5】裝配順序不用
(1)@Autowired的裝配順序如下
@Autowired默認(rèn)先按byType進(jìn)行匹配,如果發(fā)現(xiàn)找到多個bean,則又按照byName方式進(jìn)行匹配,如果還有多個,則報出異常。
(2)@Resource的裝配順序如下
(1)如果同時指定了name和type,流程如下:
(2)如果指定了name,流程如下:
只是指定了@Resource注解的name,則按name后的名字去bean元素里查找有與之相等的name屬性的bean。
(3)如果指定了type,流程如下:
只指定@Resource注解的type屬性,則從上下文中找到類型匹配的唯一bean進(jìn)行裝配,找不到或者找到多個,都會拋出異常。
(4)如果既沒有指定name,也沒有指定type,流程如下:
既不指定name屬性,也不指定type屬性,則自動按byName方式進(jìn)行查找。如果沒有找到符合的bean,則回退為一個原始類型進(jìn)行進(jìn)行查找,如果找到就注入。
【三】@Autowired使用案例
(1)參數(shù)
@Autowired 注解里面有一個 required 屬性默認(rèn)值是 true,表示強(qiáng)制要求bean實例的注入, 在應(yīng)用啟動的時候,如果 IOC 容器里面不存在對應(yīng)類型的Bean,就會報錯。當(dāng)然,如果不希望自動注入,可以把這個屬性設(shè)置成 false。
(2)取bean邏輯
如果在容器中有多個相同類型的Bean,使用@Autowired注入Bean,則去找名稱和注入屬性的屬性名相同的Bean,如果能找到唯一的,則注入成功,否則應(yīng)用啟動的時候就會報錯,大概意思是指注入只需要一個Bean實例,但在容器中找到了多個(容器不知道該注入那個Bean)。為了解決問題,需要配合@Qualifier注解使用。@Qualifier注解可以從多個相同類型的Bean里篩選出一個Bean名稱和@Qualifier注解的value屬性相同的Bean。如果容器中恰好找到一個這樣的Bean,則應(yīng)用啟動的時候成功注入這個Bean實例。同樣的,當(dāng)有多個同類型的Bean時,@Parimary標(biāo)注的Bean作為主要的Bean會被優(yōu)先注入。
(3)只使用@Autowired注解,InjectTestController注入InjectTestService
/* InjectTestController注入InjectTestService,此時容器中 有兩個InjectTestService類型的Bean(injectTestService,injectTestServiceImpl)。 因為注入屬性的屬性名為injectTestService, 容器中恰好存在一個名稱為injectTestService的Bean, 所以名稱為injectTestService的Bean可以成功注入到屬性injectTestService, 應(yīng)用啟動不報錯。*/ @Controller public class InjectTestController { @Autowired private InjectTestService injectTestService; } @Configuration public class BeanConfig { @Bean public InjectTestService injectTestService(){ return new InjectTestServiceImpl(); } } @Service public class InjectTestServiceImpl implements InjectTestService { }
(4)@Autowired注解和@Qualifier注解配合使用,InjectTestController注入InjectTestService
/* 容器中存在兩個類型為InjectTestService的Bean(injectTestService,injectTestServiceImpl), 但經(jīng)過@Qualifier的value屬性篩選,找到了名稱為injectTestServiceImpl的Bean, 因此可以成功注入到屬性service中 */ @Controller public class InjectTestController { @Autowired @Qualifier("injectTestServiceImpl") private InjectTestService service; } @Configuration public class BeanConfig { @Bean public InjectTestService injectTestService(){ return new InjectTestServiceImpl(); } } @Service public class InjectTestServiceImpl implements InjectTestService { }
(5)@Autowired注解和@Primary注解配合使用,InjectTestController注入InjectTestService
/* 容器中存在兩個類型為InjectTestService的Bean(injectTestService,injectTestServiceImpl), 但@Primary注解指定名稱為injectTestService的Bean為主Bean,在多個同類型的Bean的時候會優(yōu)先注入 因此可以成功注入到屬性service中 */ @Controller public class InjectTestController { @Autowired private InjectTestService service; } @Configuration public class BeanConfig { @Bean @Primary public InjectTestService injectTestService(){ return new InjectTestServiceImpl(); } } @Service public class InjectTestServiceImpl implements InjectTestService { }
(6)@Resource
@Resource 是 JDK 提供的注解,只是 Spring 在實現(xiàn)上提供了這個注解的功能支持。 它的使用方式和@Autowired 完全相同,最大的差異于@Resource 可以支持ByName 和 ByType 兩種注入方式。 如果使用name,Spring就根據(jù)bean的名字實現(xiàn)依賴注入,如果使用type,Spring就根據(jù)類型實現(xiàn)依賴注入。 如果兩個屬性都沒配置,就先根據(jù)定義的屬性名字去匹配,如果沒匹配成功,再根據(jù)類型匹配。兩個都沒匹配到,就報錯。
到此這篇關(guān)于Springboot @Autowired和@Resource的區(qū)別的文章就介紹到這了,更多相關(guān)Springboot @Autowired和@Resource的區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文學(xué)會處理SpringBoot統(tǒng)一返回格式
這篇文章主要介紹了一文學(xué)會處理SpringBoot統(tǒng)一返回格式,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08Java中Optional.of()方法及源碼解析(非常詳細(xì)!)
這篇文章主要給大家介紹了關(guān)于Java中Optional.of()方法及源碼解析的相關(guān)資料,Java中java.util .Optional類的of()方法用于獲得該Optional類中具有指定類型的指定值的一個實例,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06SpringBoot結(jié)合ElasticSearch實現(xiàn)模糊查詢的項目實踐
本文主要介紹了SpringBoot結(jié)合ElasticSearch實現(xiàn)模糊查詢的項目實踐,主要實現(xiàn)模糊查詢、批量CRUD、排序、分頁和高亮功能,具有一定的參考價值,感興趣的可以了解一下2024-03-03深入解析Spring?TransactionTemplate?高級用法(示例代碼)
TransactionTemplate是?Spring?框架中一個強(qiáng)大的工具,它允許開發(fā)者以編程方式控制事務(wù),通過本文的詳細(xì)解析和示例代碼,我們可以看到如何使用?`TransactionTemplate`?來執(zhí)行事務(wù)性操作,并處理高級事務(wù)場景,感興趣的朋友跟隨小編一起看看吧2025-02-02