淺談SpringBoot @Autowired的兩種注入方式
Autowired有兩種注入方式
- by type
- by name
默認(rèn)使用的是byType的方式向Bean里面注入相應(yīng)的Bean。例如:
@Autowired private UserService userService;
這段代碼會(huì)在初始化的時(shí)候,在spring容器中尋找一個(gè)類型為UserService的bean實(shí)體注入,關(guān)聯(lián)到userService的引入上。
但是如果UserService這個(gè)接口存在多個(gè)實(shí)現(xiàn)類的時(shí)候,就會(huì)在spring注入的時(shí)候報(bào)錯(cuò),例如:
public class UserService1 implements UserService public class UserService2 implements UserService
此時(shí)會(huì)報(bào)錯(cuò) org.springframework.beans.factory.BeanCreationException,而原因是注入的時(shí)候發(fā)現(xiàn)有2個(gè)匹配的bean,但是不知道要注入哪一個(gè):expected single matching bean but found 2: userService1,userService2
我們改成以下方式:
@Autowired private UserService userService1; @Autowired private UserService userService2; @Autowired @Qualifier(value = "userService2") private UserService userService3; @Test public void test(){ System.out.println(userService1.getClass().toString()); System.out.println(userService2.getClass().toString()); System.out.println(userService3.getClass().toString()); }
運(yùn)行結(jié)果:
class yjc.demo.serviceImpl.UserService1
class yjc.demo.serviceImpl.UserService2
class yjc.demo.serviceImpl.UserService2
運(yùn)行結(jié)果成功,說明了2種處理多個(gè)實(shí)現(xiàn)類的方法:
1.變量名用userService1,userService2,而不是userService。
通常情況下@Autowired是通過byType的方法注入的,可是在多個(gè)實(shí)現(xiàn)類的時(shí)候,byType的方式不再是唯一,而需要通過byName的方式來注入,而這個(gè)name默認(rèn)就是根據(jù)變量名來的。
2.通過@Qualifier注解來指明使用哪一個(gè)實(shí)現(xiàn)類,實(shí)際上也是通過byName的方式實(shí)現(xiàn)。
由此看來,@Autowired注解到底使用byType還是byName,其實(shí)是存在一定策略的,也就是有優(yōu)先級(jí)。優(yōu)先用byType,而后是byName。
到此這篇關(guān)于淺談SpringBoot @Autowired的兩種注入方式的文章就介紹到這了,更多相關(guān)SpringBoot @Autowired注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java求s=a+aa+aaa+aaaa+aa...a 5個(gè)數(shù)相加的值
求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個(gè)數(shù)字。例如2+22+222+2222+22222(此時(shí)共有5個(gè)數(shù)相加),幾個(gè)數(shù)相加有鍵盤控制2017-02-02Mybatis執(zhí)行流程、緩存原理及相關(guān)面試題匯總
最近剛學(xué)完MyBatis,趁著大好機(jī)會(huì),總結(jié)一下它的執(zhí)行流程,面試也愛問這個(gè),下面這篇文章主要給大家介紹了關(guān)于Mybatis執(zhí)行流程、緩存原理及相關(guān)面試題的相關(guān)資料,需要的朋友可以參考下2022-02-02Java并發(fā)編程之JUC并發(fā)核心AQS同步隊(duì)列原理剖析
AbstractQueuedSynchronizer 簡(jiǎn)稱 AQS,可能我們幾乎不會(huì)直接去使用它,但它卻是 JUC 的核心基礎(chǔ)組件,支撐著 java 鎖和同步器的實(shí)現(xiàn),大神 Doug Lea 在設(shè)計(jì) JUC 包時(shí)希望能夠抽象一個(gè)基礎(chǔ)且通用的組件以支撐上層模塊的實(shí)現(xiàn),AQS 應(yīng)運(yùn)而生2021-09-09Java靜態(tài)代理與動(dòng)態(tài)代理案例詳解
這篇文章主要介紹了Java靜態(tài)代理與動(dòng)態(tài)代理案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07基于Springboot的高校社團(tuán)管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
本文將基于Springboot+Mybatis開發(fā)實(shí)現(xiàn)一個(gè)高校社團(tuán)管理系統(tǒng),系統(tǒng)包含三個(gè)角色:管理員、團(tuán)長(zhǎng)、會(huì)員。文中采用的技術(shù)有Springboot、Mybatis、Jquery、AjAX、JSP等,感興趣的可以了解一下2022-07-07Mybatis plus實(shí)現(xiàn)Distinct去重功能
這篇文章主要介紹了Mybatis plus實(shí)現(xiàn)Distinct去重功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Springboot @Validated和@Valid的區(qū)別及使用詳解
這篇文章主要介紹了Springboot @Validated和@Valid的區(qū)別及使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05