快捷搜索:  汽车  科技

spring相关注解分类(Qualifier这种用法你知道吗)

spring相关注解分类(Qualifier这种用法你知道吗)@Autowired(required = false) private Date date ; @Autowired @Qualifier("birth") private Date birthday ;当系统中存在多个相同类型的Bean时,如果不使用@Qualifier程序启动是会报错默认按类型装配,默认情况下必须要求依赖对象必须存在(不存在会报错),可以通过required=false属性设置非必须 ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,示例如下:@Autowired与@Resource都可以用来装配Bean。都可以写在字段上 或写在setter方法上。区别:1、@Autowired(Spring注解)

环境: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 ;

spring相关注解分类(Qualifier这种用法你知道吗)(1)

2、@Resoure(JavaEE注解)

默认按照名称进行装配,可以通过name属性指定名称,如果没有指定name属性,当注解写在字段上时,默认取字段名进行查找注入,如果写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。示例:

还是上面的例子

@Resource private Date date

启动后会报错:

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

因为我们没有以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 = Collections.emptyList() ;

打印dates集合:

spring相关注解分类(Qualifier这种用法你知道吗)(2)

集合中注入了2个Date Bean。

修改代码:

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

在属性上加入@Qualifier注解

执行结果:

spring相关注解分类(Qualifier这种用法你知道吗)(3)

只注入了一个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() ;

运行:

spring相关注解分类(Qualifier这种用法你知道吗)(4)

注入了一个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的自动配置类中:

spring相关注解分类(Qualifier这种用法你知道吗)(5)

这里指明了只收集带有@LoadBalanced注解的RestTemplate对象。然后给对应RestTemplate设置拦截器来实现直接通过服务名就能调用接口。接下来简单介绍下RestTemplate怎么实现负载均衡。

spring相关注解分类(Qualifier这种用法你知道吗)(6)

拦截器中就开始获取服务名,然后调用createRequest方法来将serviceName换成真实的IP

spring相关注解分类(Qualifier这种用法你知道吗)(7)

ServiceRequestWrapper类

spring相关注解分类(Qualifier这种用法你知道吗)(8)

进入ServiceRequestWrapper类,该类重写了HttpRequest对象的getURI方法

spring相关注解分类(Qualifier这种用法你知道吗)(9)

通过负载均衡重写构造URI

spring相关注解分类(Qualifier这种用法你知道吗)(10)

这里相关的Ribbon相关实现的负载均衡我们都省略了,这里给出几个核心的类:

LoadBalancerAutoConfiguration.java 负载均衡自动配置

RibbonClientConfiguration.java ribbon客户端相关配置,比如:负载均衡的算法,服务列表的更新,ping健康检查等。如果想自定义实现负载均衡算法可以实现IRule类。

完毕!!!

给个关注呗谢谢

Spring Retry重试框架的应用

spring data jpa 高级应用

Spring MVC 异常处理方式

Spring MVC 异步请求方式

Spring Cloud Sentinel 熔断降级

Spring Cloud Sentinel 流控限流

Spring Cloud Sentinel 基础配置

Spring Security 自定义登录成功后的逻辑

Spring Security记住我功能实现及源码分析

Spring Boot Security防重登录及在线总数

分布式事务框架Seata之AT模式

zookeeper实现分布式ID

zookeeper实现分布式缓存

Java分布式事务实现Atomikos

SpringBoot分布式事务之最大努力通知

SpringBoot Atomikos多数据源分布式事务

SpringBoot分布式事务之可靠消息最终一致性

Springboot相关依赖引用方式及打包分离依赖包

spring相关注解分类(Qualifier这种用法你知道吗)(11)

猜您喜欢: