@Autowired一個接口有多個實現(xiàn)類的情況
@Autowired一個接口有多個實現(xiàn)類
@Autowired是spring的注解
默認(rèn)使用的是byType的方式向Bean里面注入相應(yīng)的Bean。
例如:
@Autowired private UserService userService;
這段代碼會在初始化的時候,在spring容器中尋找一個類型為UserService的bean實體注入,關(guān)聯(lián)到userService的引入上。
但是如果UserService這個接口存在多個實現(xiàn)類的時候,就會在spring注入的時候報錯,具體如下:
public class UserService1 implements UserService public class UserService2 implements UserService
當(dāng)存多個UserService的實現(xiàn)類時,錯誤信息如下:
2016-08-05 14:53:53,795 ERROR [org.springframework.test.context.TestContextManager] - <Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@14a2f921] to prepare test instance [UserServiceTest@3c87521]>
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'UserServiceTest': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private yjc.demo.service.UserService UserServiceTest.userService; nested exception is he[yjc.demo.service.UserService] is defined: expected single matching bean but found 2: userService1,userService2
拋出了org.springframework.beans.factory.BeanCreationException,而原因是注入的時候發(fā)現(xiàn)有2個匹配的bean,但是不知道要注入哪一個:
expected single matching bean but found 2: userService1,userService2
如何應(yīng)對多個實現(xiàn)類的場景呢
看一下代碼:
@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());
}運行結(jié)果:
class yjc.demo.serviceImpl.UserService1
class yjc.demo.serviceImpl.UserService2
class yjc.demo.serviceImpl.UserService2
運行結(jié)果成功
說明了2種處理多個實現(xiàn)類的方法:
1.變量名用userService1,userService2,而不是userService。
通常情況下@Autowired是通過byType的方法注入的,可是在多個實現(xiàn)類的時候,byType的方式不再是唯一,而需要通過byName的方式來注入,而這個name默認(rèn)就是根據(jù)變量名來的。
2.通過@Qualifier注解來指明使用哪一個實現(xiàn)類,實際上也是通過byName的方式實現(xiàn)。
由此看來,@Autowired注解到底使用byType還是byName,其實是存在一定策略的,也就是有優(yōu)先級。優(yōu)先用byType,而后是byName。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實現(xiàn)的獲取和判斷文件頭信息工具類用法示例
這篇文章主要介紹了Java實現(xiàn)的獲取和判斷文件頭信息工具類,結(jié)合實例形式分析了Java針對文件讀取及頭信息判斷相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
Spring Boot實現(xiàn)分布式鎖的自動釋放的示例代碼
在實際開發(fā)中,我們可以使用 Redis、Zookeeper 等分布式系統(tǒng)來實現(xiàn)分布式鎖,本文將介紹如何使用 Spring Boot 來實現(xiàn)分布式鎖的自動釋放,感興趣的朋友跟隨小編一起看看吧2023-06-06
Java實戰(zhàn)項目練習(xí)之球館在線預(yù)約系統(tǒng)的實現(xiàn)
理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SpringBoot+maven+freemark+Mysql實現(xiàn)一個球館在線預(yù)約系統(tǒng),大家可以在過程中查缺補漏,提升水平2022-01-01
java實現(xiàn)解析Cron時間表達(dá)式為中文描述
這篇文章主要為大家詳細(xì)介紹了java如何實現(xiàn)解析Cron時間表達(dá)式為中文描述,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解下2023-11-11
IntelliJ IDEA 老司機居然還沒用過 Stream Trace功能(問題小結(jié))
很多朋友酷愛Java8 Stream功能,但是在使用過程中總不是那么順利,下面通過本文給大家分享idea Stream Trace調(diào)試過程遇到的問題,需要的朋友參考下吧2021-05-05
如何通過自定義spring?invalidator注解校驗數(shù)據(jù)合法性
這篇文章主要介紹了如何通過自定義spring?invalidator注解校驗數(shù)據(jù)合法性,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
Springboot jar包遠(yuǎn)程調(diào)試詳解
這篇文章主要為大家詳細(xì)介紹了Springboot jar包遠(yuǎn)程調(diào)試,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-09-09
SpringBoot+Nacos+Kafka微服務(wù)流編排的簡單實現(xiàn)
本文主要介紹了SpringBoot+Nacos+Kafka微服務(wù)流編排的簡單實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
3行代碼快速實現(xiàn)Spring Boot Oauth2服務(wù)功能
oauthserver是一個基于Spring Boot Oauth2的完整的獨立的Oauth服務(wù)器。僅僅需要創(chuàng)建相關(guān)數(shù)據(jù)表,修改數(shù)據(jù)庫的連接信息,你就可以得到一個Oauth服務(wù)器。這篇文章給大家介紹3行代碼快速實現(xiàn)Spring Boot Oauth2服務(wù)功能,需要的朋友參考下吧2018-04-04

