Spring注解@Qualifier的詳細(xì)用法你知道幾種
環(huán)境:springboot2.3.10
一般使用在項(xiàng)目中使用@Qualifier來限定注入的Bean。
由于項(xiàng)目中我習(xí)慣用@Resource注解,所以這里先對@Autowired和@Resource進(jìn)行個簡單的說明。
@Autowired和@Resource區(qū)別
相同點(diǎn):
@Autowired與@Resource都可以用來裝配Bean。都可以寫在字段上,或?qū)懺趕etter方法上。
區(qū)別:
1、@Autowired(Spring注解)
默認(rèn)按類型裝配,默認(rèn)情況下必須要求依賴對象必須存在(不存在會報(bào)錯),可以通過required=false屬性設(shè)置非必須 ,如果我們想使用名稱裝配可以結(jié)合@Qualifier注解進(jìn)行使用,示例如下:
@Autowired(required = false)
private Date date ;
@Autowired
@Qualifier("birth")
private Date birthday ;
當(dāng)系統(tǒng)中存在多個相同類型的Bean時,如果不使用@Qualifier程序啟動是會報(bào)錯
@Bean
public Date d1() {
return new Date() ;
}
@Bean
public Date d2() {
return new Date() ;
}
@Autowired
private Date date ;

2、@Resoure(JavaEE注解)
默認(rèn)按照名稱進(jìn)行裝配,可以通過name屬性指定名稱,如果沒有指定name屬性,當(dāng)注解寫在字段上時,默認(rèn)取字段名進(jìn)行查找注入,如果寫在setter方法上默認(rèn)取屬性名進(jìn)行裝配。當(dāng)找不到與名稱匹配的bean時才按照類型進(jìn)行裝配。但是需要注意的是,如果name屬性一旦指定,就只會按照名稱進(jìn)行裝配。示例:
還是上面的例子
@Resource private Date date
啟動后會報(bào)錯:
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'java.util.Date' available: expected single matching bean but found 2: d1,d2
因?yàn)槲覀儧]有以date為名稱的bean,所以會按照類型進(jìn)行注入,但是類型又有兩個Date的Bean。將date改為d1或者d2或者指明name屬性。
@Resource("d1")
private Date date
@Autowired和@Resource就介紹到這里了
常規(guī)用法限定注入類
通過上面的示例我們已經(jīng)了解了@Qualifier的主用
@Autowired
@Qualifier("d1")
private Date date ;
用來限定注入的Bean的名稱。這種用法也是很好的理解,接下來我們介紹通過@Qualifier來篩選限定注入對象。
@Qualifier篩選注入對象
直接使用@Qualifier限定
@Qualifier
@Bean
public Date d1() {
return new Date() ;
}
@Bean
public Date d2() {
return new Date() ;
}
@Resource
private List<Date> dates = Collections.emptyList() ;
打印dates集合:

集合中注入了2個Date Bean。
修改代碼:
@Resource @Qualifier private List<Date> dates = Collections.emptyList() ;
在屬性上加入@Qualifier注解
執(zhí)行結(jié)果:

只注入了一個Date Bean。
@Qualifier起到了一個篩選的作用只有Bean上加有@Qualifier注解的Bean才會被收集注入。
自定義注解限定注入Bean
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Qualifier
public @interface FK {
}
注意:該自定義注解上添加有@Qualifier注解。
@FK
@Bean
public Date d1() {
return new Date() ;
}
@Bean
public Date d2() {
return new Date() ;
}
@Resource
@FK
private List<Date> dates = Collections.emptyList() ;
運(yùn)行:

注入了一個Date Bean。
該使用示例在Spring Cloud中Ribbon是也有應(yīng)用的。
在使用Ribbon做負(fù)載均衡時,在配置RestTemplate時會加入如下注解:
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate() ;
}
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Qualifier
public @interface LoadBalanced {
}
在Ribbon的自動配置類中:

這里指明了只收集帶有@LoadBalanced注解的RestTemplate對象。然后給對應(yīng)RestTemplate設(shè)置攔截器來實(shí)現(xiàn)直接通過服務(wù)名就能調(diào)用接口。接下來簡單介紹下RestTemplate怎么實(shí)現(xiàn)負(fù)載均衡。

攔截器中就開始獲取服務(wù)名,然后調(diào)用createRequest方法來將serviceName換成真實(shí)的IP

ServiceRequestWrapper類

進(jìn)入ServiceRequestWrapper類,該類重寫了HttpRequest對象的getURI方法

通過負(fù)載均衡重寫構(gòu)造URI

這里相關(guān)的Ribbon相關(guān)實(shí)現(xiàn)的負(fù)載均衡我們都省略了,這里給出幾個核心的類:
LoadBalancerAutoConfiguration.java 負(fù)載均衡自動配置
RibbonClientConfiguration.java ribbon客戶端相關(guān)配置,比如:負(fù)載均衡的算法,服務(wù)列表的更新,ping健康檢查等。如果想自定義實(shí)現(xiàn)負(fù)載均衡算法可以實(shí)現(xiàn)IRule類。
完畢?。?!
到此這篇關(guān)于Spring注解@Qualifier這種用法你知道嗎?的文章就介紹到這了,更多相關(guān)Spring注解@Qualifier內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)適用于安卓的文件下載線程類
本文給大家分享的是java實(shí)現(xiàn)適用于安卓的文件下載線程類的代碼,有需要的小伙伴可以參考下2015-07-07
SpringBoot integration實(shí)現(xiàn)分布式鎖的示例詳解
常規(guī)項(xiàng)目都是采用Redission來實(shí)現(xiàn)分布式鎖,進(jìn)行分布式系統(tǒng)中資源競爭加鎖操作,偶然發(fā)現(xiàn)SpringBoot中的integration也實(shí)現(xiàn)多種載體的分布式鎖控制,下面我們就來看看具體實(shí)現(xiàn)方法吧2023-12-12
關(guān)于RedisTemplate之opsForValue的使用說明
這篇文章主要介紹了關(guān)于RedisTemplate之opsForValue的使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
深入理解JSON及其在Java中的應(yīng)用小結(jié)
json它是一種輕量級的數(shù)據(jù)交換格式,由于其易于閱讀和編寫,同時也易于機(jī)器解析和生成,因此廣泛應(yīng)用于網(wǎng)絡(luò)數(shù)據(jù)交換和配置文件,這篇文章主要介紹了深入理解JSON及其在Java中的應(yīng)用,需要的朋友可以參考下2023-12-12
java實(shí)現(xiàn)Composite組合模式的實(shí)例代碼
這篇文章主要介紹了java實(shí)現(xiàn)Composite組合模式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
基于SpringIOC創(chuàng)建對象的四種方式總結(jié)
這篇文章主要介紹了基于SpringIOC創(chuàng)建對象的四種方式總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06

