Spring注解@Qualifier的详细⽤法你知道⼏种
环境:springboot2.3.10
⼀般使⽤在项⽬中使⽤@Qualifier来限定注⼊的Bean。
由于项⽬中我习惯⽤@Resource注解,所以这⾥先对@Autowired和@Resource进⾏个简单的说明。
@Autowired和@Resource区别
相同点:
@Autowired与@Resource都可以⽤来装配Bean。都可以写在字段上,或写在setter⽅法上。
区别:
1、@Autowired(Spring注解)
默认按类型装配,默认情况下必须要求依赖对象必须存在(不存在会报错),可以通过required=false属性设置⾮必须,如果我们想使⽤名称装配可以结合@Qualifier注解进⾏使⽤,⽰例如下:
@Autowired(required = false)
private Date date ;
@Autowired
@Qualifier("birth")
private Date birthday ;
当系统中存在多个相同类型的Bean时,如果不使⽤@Qualifier程序启动是会报错
@Bean
public Date d1() {
return new Date() ;
}
@Bean
public Date d2() {
return new Date() ;
}
@Autowired
private Date date ;
2、@Resoure(JavaEE注解)
默认按照名称进⾏装配,可以通过name属性指定名称,如果没有指定name属性,当注解写在字段上时,默认取字段名进⾏查注⼊,如果写在setter⽅法上默认取属性名进⾏装配。当不到与名称匹配的bean时才按照类型进⾏装配。但是需要注意的是,如果name属性⼀旦指定,就只会按照名称进⾏装配。⽰例:
还是上⾯的例⼦
@Resource
private Date date
启动后会报错:
spring framework guruCaused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'java.util.Date' available:
expected single matching bean but found 2: d1,d2
因为我们没有以date为名称的bean,所以会按照类型进⾏注⼊,但是类型⼜有两个Date的Bean。将date改为d1或者d2或者指明name属性。
@Resource("d1")
private Date date
@Autowired和@Resource就介绍到这⾥了
常规⽤法限定注⼊类
通过上⾯的⽰例我们已经了解了@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 = ptyList() ;
打印dates集合:
集合中注⼊了2个Date Bean。
修改代码:
@Resource
@Qualifier
private List<Date> dates = ptyList() ;
在属性上加⼊@Qualifier注解
执⾏结果:
只注⼊了⼀个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 = ptyList() ;
运⾏:
注⼊了⼀个Date Bean。
该使⽤⽰例在Spring Cloud中Ribbon是也有应⽤的。
在使⽤Ribbon做负载均衡时,在配置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对象。然后给对应RestTemplate设置来实现直接通过服务名就能调⽤接⼝。接下来简单介绍下RestTemplate怎么实现负载均衡。
中就开始获取服务名,然后调⽤createRequest⽅法来将serviceName换成真实的IP
ServiceRequestWrapper类
进⼊ServiceRequestWrapper类,该类重写了HttpRequest对象的getURI⽅法
通过负载均衡重写构造URI
这⾥相关的Ribbon相关实现的负载均衡我们都省略了,这⾥给出⼏个核⼼的类:
LoadBalancerAutoConfiguration.java 负载均衡⾃动配置
RibbonClientConfiguration.java ribbon客户端相关配置,⽐如:负载均衡的算法,服务列表的更新,pin
g健康检查等。如果想⾃定义实现负载均衡算法可以实现IRule类。
完毕
到此这篇关于Spring注解@Qualifier这种⽤法你知道吗?的⽂章就介绍到这了,更多相关Spring注解@Qualifier内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。