Spring注解@Qualifier的详细用法你知道几种

 更新时间:2021年07月12日 09:25:26   作者:FastCoder  
本文给大家分享Spring注解@Qualifier的详细用法,包括@Autowired和@Resource区别介绍,本文通过示例代码给大家详细介绍,感兴趣的朋友跟随小编一起看看吧

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

启动后会报错:

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集合:

集合中注入了2个Date Bean。

修改代码:

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

在属性上加入@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 = Collections.emptyList() ;

运行:

注入了一个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客户端相关配置,比如:负载均衡的算法,服务列表的更新,ping健康检查等。如果想自定义实现负载均衡算法可以实现IRule类。

完毕!!!

到此这篇关于Spring注解@Qualifier这种用法你知道吗?的文章就介绍到这了,更多相关Spring注解@Qualifier内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java实现适用于安卓的文件下载线程类

    java实现适用于安卓的文件下载线程类

    本文给大家分享的是java实现适用于安卓的文件下载线程类的代码,有需要的小伙伴可以参考下
    2015-07-07
  • spring cglib 与 jdk 动态代理

    spring cglib 与 jdk 动态代理

    本篇文章主要介绍了spring cglib与jdk动态代理的相关知识,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-05-05
  • SpringBoot integration实现分布式锁的示例详解

    SpringBoot integration实现分布式锁的示例详解

    常规项目都是采用Redission来实现分布式锁,进行分布式系统中资源竞争加锁操作,偶然发现SpringBoot中的integration也实现多种载体的分布式锁控制,下面我们就来看看具体实现方法吧
    2023-12-12
  • 关于RedisTemplate之opsForValue的使用说明

    关于RedisTemplate之opsForValue的使用说明

    这篇文章主要介绍了关于RedisTemplate之opsForValue的使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 深入理解JSON及其在Java中的应用小结

    深入理解JSON及其在Java中的应用小结

    json它是一种轻量级的数据交换格式,由于其易于阅读和编写,同时也易于机器解析和生成,因此广泛应用于网络数据交换和配置文件,这篇文章主要介绍了深入理解JSON及其在Java中的应用,需要的朋友可以参考下
    2023-12-12
  • java实现Composite组合模式的实例代码

    java实现Composite组合模式的实例代码

    这篇文章主要介绍了java实现Composite组合模式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 基于SpringIOC创建对象的四种方式总结

    基于SpringIOC创建对象的四种方式总结

    这篇文章主要介绍了基于SpringIOC创建对象的四种方式总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • java map中相同的key保存多个value值方式

    java map中相同的key保存多个value值方式

    这篇文章主要介绍了java map中相同的key保存多个value值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java基于UDP协议的聊天室功能

    Java基于UDP协议的聊天室功能

    这篇文章主要为大家详细介绍了Java基于UDP协议的聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • Java中==与equals的区别小结

    Java中==与equals的区别小结

    这篇文章主要介绍了Java中==与equals的区别小结,本文总结结论:== 与 equals()比较的内容是不同的,equals()方式是String类中的方法,它用于比较两个对象引用所指的内容是否相等,而 == 比较的是两个对象引用的地址是否相等,需要的朋友可以参考下
    2015-06-06

最新评论