专栏首页码农小胖哥的码农生涯Spring中的@Qualifier注解你会用吗

Spring中的@Qualifier注解你会用吗

1.概述

本文小胖哥将带你来了解一下Spring中的@Qualifier注解,它解决了哪些问题,以及如何使用它。我们还将了解它与@Primary注解的不同之处。

2.痛点

使用@Autowired注解是Spring依赖注入的绝好方法。但是有些场景下仅仅靠这个注解不足以让Spring知道到底要注入哪个bean。默认情况下,@Autowired按类型装配Spring bean。如果容器中有多个相同类型的bean,则框架将抛出NoUniqueBeanDefinitionException, 以提示有多个满足条件的bean进行自动装配。程序无法正确做出判断使用哪一个,下面就是个鲜活的例子:

如果我们尝试将FooService加载到我们的上下文中,Spring框架将抛出NoUniqueBeanDefinitionException。这是因为Spring不知道要注入哪个bean。为了避免这个问题,有几种解决方案。那么我们本文要讲解的@Qualifier注解就是其中之一。跟着小胖哥的节奏往下走。

3.@Qualifier

通过使用@Qualifier注解,我们可以消除需要注入哪个bean的问题。让我们重新回顾一下前面的例子,看看我们如何通过包含@Qualifier注释来指出我们想要使用哪个bean来解决问题:

通过将@Qualifier注解与我们想要使用的特定spring bean的名称一起进行装配,Spring框架就能从多个相同类型并满足装配要求的bean中找到我们想要的,避免让Spring脑裂。我们需要做的是@Component或者@Bean注解中声明的value属性以确定名称。其实我们也可以在Formatter实现类上使用@Qualifier注释,而不是在@Component或者@Bean中指定名称,也能达到相同的效果:

4.@Qualifier vs @Primary

还有另一个名为@Primary的注解,我们也可以用来发生依赖注入的歧义时决定要注入哪个bean。当存在多个相同类型的bean时,此注解定义了首选项。除非另有说明,否则将使用与@Primary注释关联的bean 。我们来看一个例子:

在此示例中,两个方法都返回相同的Employee类型。Spring将注入的bean是方法tonyEmployee返回的bean。这是因为它包含@Primary注解。当我们想要指定默认情况下应该注入特定类型的bean时,此注解很有用。如果我们在某个注入点需要另一个bean,我们需要专门指出它。我们可以通过@Qualifier注解来做到这一点。例如,我们可以通过使用@Qualifier注解来指定我们想要使用johnEmployee方法返回的bean 。值得注意的是,如果@Qualifier和@Primary注释都存在,那么@Qualifier注释将具有优先权。基本上,@ Primary是定义了默认值,而@Qualifier则非常具体。当然@Component也可以使用@Primary注解,这次使用的还是上面3的示例:

在这种情况下,@ Primary注解指定了默认注入的是FooFormatter,消除了场景中的注入歧义。

5.通过名称来自动注入

在使用@Autowired进行自动装配时,如果Spring没有其他提示,将会按照需要注入的变量名称来寻找合适的bean。也可以解决依赖注入歧义的问题。让我们看一些基于我们最初的例子的代码:

在这种情况下,Spring将确定要注入的bean是FooFormatter,因为字段名称与我们在该bean 的@Component或者@Bean注解中使用的值相匹配。 通过对@Qualifier 的探讨,我们知道该注解是用来消除依赖注入冲突的。这种在日常开发,比如 rabbtimq的 队列声明中很常见。小胖哥也通过该注解和其他上述注解的组合使用和对比中展示了一些常用的用法。这将有助于你对spring的依赖注入机制的了解。

本文分享自微信公众号 - 码农小胖哥(Felordcn),作者:码农小胖哥

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • @ConditionalOn...注解,条件组合你知道吗?

    上一篇文章 你应该知道的 @ConfigurationProperties 注解的使用姿势,这一篇就够了 介绍了如何通过 @ConfigurationPrope...

    码农小胖哥
  • java必学核心知识总结——注解

    前几年我们的项目还在structs 2 上跑,有一次问一个同事是否知道Spring Boot,同事说那不是用注解来开发的吗。虽然这个答案并不完全对,但是从客观上...

    码农小胖哥
  • Lombok 使用详解,简化Java编程

    在 Java 应用程序中存在许多重复相似的、生成之后几乎不对其做更改的代码,但是我们还不得不花费很多精力编写它们来满足 Java 的编译需求

    码农小胖哥
  • SpringBoot2.x系列教程(八)SpringBoot常用注解汇总

    随着Spring及Spring Boot的发展,基于Java的配置已经慢慢替代了基于xml的配置形式。本篇文章为大家整理和简介Spring Boot中常用的注解...

    用户1161110
  • Linux之父回来了!

    Linus Torvalds,这位软件工程师和直言不讳的Linux内核创建者,目前已经回归监督开源项目了。

    新智元
  • Spring官网阅读(五)BeanDefinition(下)

    在上篇文章中,我们学习了BeanDefinition的一些属性,其中有以下几个属性:

    程序员DMZ
  • Spring官网阅读系列(五):BeanDefinition(下)

    在上篇文章中,我们学习了BeanDefinition的一些属性,其中有以下几个属性:

    秃顶的Java程序员
  • JavaScript 事件循环机制

    javascript是一门单线程的非阻塞的脚本语言。单线程意味着javascript在执行代码的任何时候,都只有一个主线程来处理所有的任务。

    嘉明
  • BlockCanary原理分析

    用户1205080
  • 给安卓Chrome加入主页按钮

    美丽应用

扫码关注云+社区

领取腾讯云代金券