偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Spring注解@Qualifier這些用法,你都清楚嗎?

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

環(huán)境:springboot2.3.10

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

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

@Autowired和@Resource區(qū)別

相同點(diǎn):

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

區(qū)別:

1、@Autowired(Spring注解)

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

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

當(dāng)系統(tǒng)中存在多個(gè)相同類型的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)按照名稱進(jìn)行裝配,可以通過name屬性指定名稱,如果沒有指定name屬性,當(dāng)注解寫在字段上時(shí),默認(rèn)取字段名進(jìn)行查找注入,如果寫在setter方法上默認(rèn)取屬性名進(jìn)行裝配。當(dāng)找不到與名稱匹配的bean時(shí)才按照類型進(jìn)行裝配。但是需要注意的是,如果name屬性一旦指定,就只會(huì)按照名稱進(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)槲覀儧]有以date為名稱的bean,所以會(huì)按照類型進(jìn)行注入,但是類型又有兩個(gè)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來篩選限定注入對(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)配置類中:

圖片圖片

這里指明了只收集帶有@LoadBalanced注解的RestTemplate對(duì)象。然后給對(duì)應(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對(duì)象的getURI方法

圖片圖片

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

圖片圖片

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

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

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

責(zé)任編輯:武曉燕 來源: 實(shí)戰(zhàn)案例錦集
相關(guān)推薦

2023-04-28 12:37:59

Spring@Bean使用方式

2023-04-23 09:50:50

@BeanSpring

2019-02-12 11:15:15

Spring設(shè)計(jì)模式Java

2024-04-28 08:20:52

Controller接口URL

2021-07-29 06:55:03

Spring@AutowriedbyType注入

2023-12-07 08:13:58

Java開發(fā)

2021-09-13 13:05:05

Redis數(shù)據(jù)庫內(nèi)存

2023-02-27 23:45:09

MySQL索引存儲(chǔ)

2023-02-15 08:12:19

http超時(shí)過濾器

2021-01-07 05:40:13

BLE模塊Android

2022-10-17 07:40:21

AI項(xiàng)目數(shù)據(jù)

2023-09-14 23:14:57

MySQL索引

2020-08-06 11:05:30

函數(shù)調(diào)用寄存器語言

2016-01-11 09:48:07

2018-06-21 07:25:04

2019-09-17 09:31:10

2021-08-05 18:21:29

Autowired代碼spring

2023-12-11 07:40:00

CDN網(wǎng)絡(luò)服務(wù)器

2019-05-08 10:50:37

交換機(jī)組網(wǎng)網(wǎng)絡(luò)

2022-03-03 07:34:31

注解容器作用域
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)