文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring注解@Qualifier这些用法,你都清楚吗?

2024-11-30 10:35

关注

一般使用在项目中使用@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 dates = Collections.emptyList() ;

打印dates集合:

图片

集合中注入了2个Date Bean。

修改代码:

@Resource
@Qualifier
private List 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 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类。

来源:实战案例锦集内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯