Spring注解@Qualifier的使用&&與@Primary注解的不同
1. 概述
今天帶你了解一下 Spring 框架中的 @Qualifier
注解,它解決了哪些問題,以及如何使用它。我們還將了解它與 @Primary
注解的不同之處。更多的技術(shù)解析請(qǐng)?jiān)L問 felord.cn
2. 痛點(diǎn)
使用 @Autowired
注解是 Spring 依賴注入的絕好方法。但是有些場(chǎng)景下僅僅靠這個(gè)注解不足以讓Spring知道到底要注入哪個(gè) bean。
默認(rèn)情況下,@Autowired
按類型裝配 Spring Bean。
如果容器中有多個(gè)相同類型的 bean,則框架將拋出 NoUniqueBeanDefinitionException
, 以提示有多個(gè)滿足條件的 bean 進(jìn)行自動(dòng)裝配。程序無(wú)法正確做出判斷使用哪一個(gè),下面就是個(gè)鮮活的例子:
@Component("fooFormatter") public class FooFormatter implements Formatter { public String format() { return "foo"; } } @Component("barFormatter") public class BarFormatter implements Formatter { public String format() { return "bar"; } } @Component public class FooService { @Autowired private Formatter formatter; //todo }
如果我們嘗試將 FooService
加載到我們的上下文中,Spring 框架將拋出 NoUniqueBeanDefinitionException
。這是因?yàn)?nbsp;Spring 不知道要注入哪個(gè) bean。為了避免這個(gè)問題,有幾種解決方案。那么我們本文要講解的 @Qualifier
注解就是其中之一。跟著小胖哥的節(jié)奏往下走。
3. @Qualifier
通過(guò)使用 @Qualifier
注解,我們可以消除需要注入哪個(gè) bean 的問題。讓我們重新回顧一下前面的例子,看看我們?nèi)绾瓮ㄟ^(guò)包含 @Qualifier
注釋來(lái)指出我們想要使用哪個(gè) bean 來(lái)解決問題:
@Component public class FooService { @Autowired @Qualifier("fooFormatter") private Formatter formatter; //todo }
通過(guò)將 @Qualifier
注解與我們想要使用的特定 Spring bean 的名稱一起進(jìn)行裝配,Spring 框架就能從多個(gè)相同類型并滿足裝配要求的 bean 中找到我們想要的,避免讓Spring腦裂。我們需要做的是@Component或者@Bean注解中聲明的value屬性以確定名稱。
其實(shí)我們也可以在 Formatter
實(shí)現(xiàn)類上使用 @Qualifier
注釋,而不是在 @Component
或者 @Bean
中指定名稱,也能達(dá)到相同的效果:
@Component @Qualifier("fooFormatter") public class FooFormatter implements Formatter { public String format() { return "foo"; } } @Component @Qualifier("barFormatter") public class BarFormatter implements Formatter { public String format() { return "bar"; } }
4. @Qualifier VS @Primary
還有另一個(gè)名為 @Primary
的注解,我們也可以用來(lái)發(fā)生依賴注入的歧義時(shí)決定要注入哪個(gè) bean。當(dāng)存在多個(gè)相同類型的 bean 時(shí),此注解定義了首選項(xiàng)。除非另有說(shuō)明,否則將使用與 @Primary
注釋關(guān)聯(lián)的 bean 。
我們來(lái)看一個(gè)例子:
@Bean public Employee tomEmployee() { return new Employee("Tom"); } @Bean @Primary public Employee johnEmployee() { return new Employee("john"); }
在此示例中,兩個(gè)方法都返回相同的 Employee
類型。Spring 將注入的 bean 是方法 johnEmployee
返回的 bean。這是因?yàn)樗?nbsp;@Primary
注解。當(dāng)我們想要指定默認(rèn)情況下應(yīng)該注入特定類型的 bean 時(shí),此注解很有用。
如果我們?cè)谀硞€(gè)注入點(diǎn)需要另一個(gè) bean,我們需要專門指出它。我們可以通過(guò) @Qualifier
注解來(lái)做到這一點(diǎn)。例如,我們可以通過(guò)使用 @Qualifier
注釋來(lái)指定我們想要使用 tomEmployee
方法返回的 bean 。
值得注意的是,如果 @Qualifier
和 @Primary
注釋都存在,那么 @Qualifier
注釋將具有優(yōu)先權(quán)?;旧希?code>@Primary 是定義了默認(rèn)值,而 @Qualifier
則非常具體。
當(dāng)然@Component
也可以使用@Primary
注解,這次使用的還是上面3的示例:
@Component @Primary public class FooFormatter implements Formatter { public String format() { return "foo"; } } @Component public class BarFormatter implements Formatter { public String format() { return "bar"; } }
在這種情況下,@Primary
注解指定了默認(rèn)注入的是 FooFormatter
,消除了場(chǎng)景中的注入歧義。
5. 通過(guò)名稱來(lái)自動(dòng)注入
在使用 @Autowired
進(jìn)行自動(dòng)裝配時(shí),如果 Spring 沒有其他提示,將會(huì)按照需要注入的變量名稱來(lái)尋找合適的 bean。也可以解決依賴注入歧義的問題。讓我們看一些基于我們最初的例子的代碼:
@Component public class FooService { @Autowired private Formatter fooFormatter; //todo }
在這種情況下,Spring 將確定要注入的 bean 是 FooFormatter
,因?yàn)樽侄蚊Q與我們?cè)谠?nbsp;bean 的 @Component
或者 @Bean
注解中使用的值(默認(rèn) @Bean
使用方法名)相匹配。
到此這篇關(guān)于Spring 注解 @Qualifier 詳解的文章就介紹到這了,更多相關(guān)Spring 注解 @Qualifier內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)較大二進(jìn)制文件的讀、寫方法
本篇文章主要介紹了Java實(shí)現(xiàn)較大二進(jìn)制文件的讀、寫方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02JAVA遞歸生成樹形菜單的實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了JAVA遞歸生成樹形菜單,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01Spring計(jì)時(shí)器StopWatch的具體使用
本文主要介紹了Spring計(jì)時(shí)器StopWatch的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06java編程實(shí)現(xiàn)獲取服務(wù)器IP地址及MAC地址的方法
這篇文章主要介紹了java編程實(shí)現(xiàn)獲取機(jī)器IP地址及MAC地址的方法,實(shí)例分析了Java分別針對(duì)單網(wǎng)卡及多網(wǎng)卡的情況下獲取服務(wù)器IP地址與MAC地址的相關(guān)技巧,需要的朋友可以參考下2015-11-11java 驗(yàn)證用戶是否已經(jīng)登錄與實(shí)現(xiàn)自動(dòng)登錄方法詳解
本文主要介紹了java 驗(yàn)證用戶是否已經(jīng)登錄與實(shí)現(xiàn)自動(dòng)登錄的方法。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01