亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring注解@Qualifier的詳細(xì)用法你知道幾種

 更新時(shí)間:2021年07月12日 09:25:26   作者:FastCoder  
本文給大家分享Spring注解@Qualifier的詳細(xì)用法,包括@Autowired和@Resource區(qū)別介紹,本文通過(guò)示例代碼給大家詳細(xì)介紹,感興趣的朋友跟隨小編一起看看吧

環(huán)境:springboot2.3.10

一般使用在項(xiàng)目中使用@Qualifier來(lái)限定注入的Bean。

由于項(xiàng)目中我習(xí)慣用@Resource注解,所以這里先對(duì)@Autowired和@Resource進(jìn)行個(gè)簡(jiǎn)單的說(shuō)明。

@Autowired和@Resource區(qū)別

相同點(diǎn):

@Autowired與@Resource都可以用來(lái)裝配Bean。都可以寫(xiě)在字段上,或?qū)懺趕etter方法上。

區(qū)別:

1、@Autowired(Spring注解)

默認(rèn)按類(lèi)型裝配,默認(rèn)情況下必須要求依賴(lài)對(duì)象必須存在(不存在會(huì)報(bào)錯(cuò)),可以通過(guò)required=false屬性設(shè)置非必須 ,如果我們想使用名稱(chēng)裝配可以結(jié)合@Qualifier注解進(jìn)行使用,示例如下:

@Autowired(required = false)
private Date date ;
@Autowired
@Qualifier("birth")
private Date birthday ;

當(dāng)系統(tǒng)中存在多個(gè)相同類(lèi)型的Bean時(shí),如果不使用@Qualifier程序啟動(dòng)是會(huì)報(bào)錯(cuò)

@Bean
public Date d1() {
  return new Date() ;
}
@Bean
public Date d2() {
  return new Date() ;
}
@Autowired
private Date date ;

2、@Resoure(JavaEE注解)

默認(rèn)按照名稱(chēng)進(jìn)行裝配,可以通過(guò)name屬性指定名稱(chēng),如果沒(méi)有指定name屬性,當(dāng)注解寫(xiě)在字段上時(shí),默認(rèn)取字段名進(jìn)行查找注入,如果寫(xiě)在setter方法上默認(rèn)取屬性名進(jìn)行裝配。當(dāng)找不到與名稱(chēng)匹配的bean時(shí)才按照類(lèi)型進(jìn)行裝配。但是需要注意的是,如果name屬性一旦指定,就只會(huì)按照名稱(chēng)進(jìn)行裝配。示例:

還是上面的例子

@Resource
private Date date

啟動(dòng)后會(huì)報(bào)錯(cuò):

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)槲覀儧](méi)有以date為名稱(chēng)的bean,所以會(huì)按照類(lèi)型進(jìn)行注入,但是類(lèi)型又有兩個(gè)Date的Bean。將date改為d1或者d2或者指明name屬性。

@Resource("d1")
private Date date

@Autowired和@Resource就介紹到這里了

常規(guī)用法限定注入類(lèi)

通過(guò)上面的示例我們已經(jīng)了解了@Qualifier的主用

@Autowired
@Qualifier("d1")
private Date date ;

用來(lái)限定注入的Bean的名稱(chēng)。這種用法也是很好的理解,接下來(lái)我們介紹通過(guò)@Qualifier來(lái)篩選限定注入對(duì)象。

@Qualifier篩選注入對(duì)象

直接使用@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個(gè)Date Bean。

修改代碼:

@Resource
@Qualifier
private List<Date> dates = Collections.emptyList() ;

在屬性上加入@Qualifier注解

執(zhí)行結(jié)果:

只注入了一個(gè)Date Bean。

@Qualifier起到了一個(gè)篩選的作用只有Bean上加有@Qualifier注解的Bean才會(huì)被收集注入。

自定義注解限定注入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)行:

注入了一個(gè)Date Bean。

該使用示例在Spring Cloud中Ribbon是也有應(yīng)用的。

在使用Ribbon做負(fù)載均衡時(shí),在配置RestTemplate時(shí)會(huì)加入如下注解:

@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的自動(dòng)配置類(lèi)中:

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

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

ServiceRequestWrapper類(lèi)

進(jìn)入ServiceRequestWrapper類(lèi),該類(lèi)重寫(xiě)了HttpRequest對(duì)象的getURI方法

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

這里相關(guān)的Ribbon相關(guān)實(shí)現(xiàn)的負(fù)載均衡我們都省略了,這里給出幾個(gè)核心的類(lèi):

LoadBalancerAutoConfiguration.java 負(fù)載均衡自動(dòng)配置

RibbonClientConfiguration.java ribbon客戶(hù)端相關(guān)配置,比如:負(fù)載均衡的算法,服務(wù)列表的更新,ping健康檢查等。如果想自定義實(shí)現(xiàn)負(fù)載均衡算法可以實(shí)現(xiàn)IRule類(lèi)。

完畢?。。?/p>

到此這篇關(guān)于Spring注解@Qualifier這種用法你知道嗎?的文章就介紹到這了,更多相關(guān)Spring注解@Qualifier內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實(shí)現(xiàn)適用于安卓的文件下載線(xiàn)程類(lèi)

    java實(shí)現(xiàn)適用于安卓的文件下載線(xiàn)程類(lèi)

    本文給大家分享的是java實(shí)現(xiàn)適用于安卓的文件下載線(xiàn)程類(lèi)的代碼,有需要的小伙伴可以參考下
    2015-07-07
  • spring cglib 與 jdk 動(dòng)態(tài)代理

    spring cglib 與 jdk 動(dòng)態(tài)代理

    本篇文章主要介紹了spring cglib與jdk動(dòng)態(tài)代理的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-05-05
  • SpringBoot integration實(shí)現(xiàn)分布式鎖的示例詳解

    SpringBoot integration實(shí)現(xiàn)分布式鎖的示例詳解

    常規(guī)項(xiàng)目都是采用Redission來(lái)實(shí)現(xiàn)分布式鎖,進(jìn)行分布式系統(tǒng)中資源競(jìng)爭(zhēng)加鎖操作,偶然發(fā)現(xiàn)SpringBoot中的integration也實(shí)現(xiàn)多種載體的分布式鎖控制,下面我們就來(lái)看看具體實(shí)現(xiàn)方法吧
    2023-12-12
  • 關(guān)于RedisTemplate之opsForValue的使用說(shuō)明

    關(guān)于RedisTemplate之opsForValue的使用說(shuō)明

    這篇文章主要介紹了關(guān)于RedisTemplate之opsForValue的使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 深入理解JSON及其在Java中的應(yīng)用小結(jié)

    深入理解JSON及其在Java中的應(yīng)用小結(jié)

    json它是一種輕量級(jí)的數(shù)據(jù)交換格式,由于其易于閱讀和編寫(xiě),同時(shí)也易于機(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í)例代碼

    這篇文章主要介紹了java實(shí)現(xiàn)Composite組合模式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 基于SpringIOC創(chuàng)建對(duì)象的四種方式總結(jié)

    基于SpringIOC創(chuàng)建對(duì)象的四種方式總結(jié)

    這篇文章主要介紹了基于SpringIOC創(chuàng)建對(duì)象的四種方式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • java map中相同的key保存多個(gè)value值方式

    java map中相同的key保存多個(gè)value值方式

    這篇文章主要介紹了java map中相同的key保存多個(gè)value值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java基于UDP協(xié)議的聊天室功能

    Java基于UDP協(xié)議的聊天室功能

    這篇文章主要為大家詳細(xì)介紹了Java基于UDP協(xié)議的聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Java中==與equals的區(qū)別小結(jié)

    Java中==與equals的區(qū)別小結(jié)

    這篇文章主要介紹了Java中==與equals的區(qū)別小結(jié),本文總結(jié)結(jié)論:== 與 equals()比較的內(nèi)容是不同的,equals()方式是String類(lèi)中的方法,它用于比較兩個(gè)對(duì)象引用所指的內(nèi)容是否相等,而 == 比較的是兩個(gè)對(duì)象引用的地址是否相等,需要的朋友可以參考下
    2015-06-06

最新評(píng)論