当前位置: 首页 > news >正文

Spring 注解 @Qualifier 详细解析

1. 概述

今天带你了解一下Spring框架中的@Qualifier注解,它解决了哪些问题,以及如何使用它。我们还将了解它与@Primary注解的不同之处。

2. 痛点

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

@Component("fooFormatter") public class FooFormatter implements Formatter { public String format() { return "foo"; } } @Component("barFormatter") public class BarFormatter implements Formatter { public String format() { return "bar"; } } @Component public class FooService { @Autowired private Formatter formatter; //todo }

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

3. @Qualifier

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

@Component public class FooService { @Autowired @Qualifier("fooFormatter") private Formatter formatter; //todo }

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

@Component @Qualifier("fooFormatter") public class FooFormatter implements Formatter { public String format() { return "foo"; } } @Component @Qualifier("barFormatter") public class BarFormatter implements Formatter { public String format() { return "bar"; } }

4. @Qualifier VS @Primary


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

@Bean public Employee tomEmployee() { return new Employee("Tom"); } @Bean @Primary public Employee johnEmployee() { return new Employee("john"); }

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

@Component @Primary public class FooFormatter implements Formatter { public String format() { return "foo"; } } @Component public class BarFormatter implements Formatter { public String format() { return "bar"; } }

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

5. 通过名称来自动注入

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

@Component public class FooService { @Autowired private Formatter fooFormatter; //todo }

在这种情况下,Spring将确定要注入的beanFooFormatter,因为字段名称与我们在该bean@Component或者@Bean注解中使用的值(默认@Bean使用方法名)相匹配。

6. 总结

通过对@Qualifier的探讨,我们知道该注解是用来消除依赖注入冲突的。这种在日常开发,比如Rabbtimq的队列声明中很常见。小胖哥也通过该注解和其他上述注解的组合使用和对比中展示了一些常用的用法。这将有助于你对Spring的依赖注入机制的了解。

http://www.jsqmd.com/news/592861/

相关文章:

  • 别再只看电流了!航模电调(ESC)的隐藏功能与安全机制深度解读
  • 5G时代下,MEC如何让无人驾驶不再‘卡顿’?——边缘计算实战解析
  • 告别云端依赖:用Docker-Compose搭建私有化Jitsi-Meet,并打包成离线安装包
  • 高效排班与分配:8 款专业项目资源管理系统深度对比
  • DeepSeek-R1-Distill-Qwen-1.5B实战体验:1.5B参数跑出7B效果,实测速度超快
  • PyMOL科研出图利器:手把手教你用‘拖拽+动画’功能讲好分子结合故事
  • 告别手动调参:用快马平台ai辅助高效整定pid控制器参数
  • 从仿真到真机:在快马平台构建基于OpenClaw与ROS的机械臂智能抓取实战系统
  • 2026年4月目前技术好的高低温试验箱厂商口碑推荐,冷热冲击试验箱/三综合试验箱/恒温恒湿试验箱,高低温试验箱厂商哪个好 - 品牌推荐师
  • OpenGL天空盒实战:从零搭建到环境反射效果(附完整代码)
  • OpenClaw人人养虾:API Key 与 Token 过期追踪
  • 从面试到实战:XXL-Job核心原理与高频场景解析
  • 开源工具Wand-Enhancer功能解锁使用指南
  • 蒙阴炒鸡哪家口味好?家庭聚会/团建优选,福地锦园木柴鸡藏着地道蒙阴味 - 宁夏壹山网络
  • 温度通信系统 LCD显示+上位机显示 传感器使用的是ds18b20,LCD显示温度,还可以串口...
  • 4大场景化解决方案:CyberpunkSaveEditor存档修改工具全指南
  • [计算机网络] 查看计算机设备MAC地址的方法
  • 5分钟攻克系统激活:开源激活工具的极简解决方案
  • 新手福音:告别环境配置噩梦,在快马平台直接体验jdk1.8编程
  • arXiv论文太多看不过来?教你用Python+Paper Agent搭建智能推荐系统(支持本地PDF分析)
  • OpenClaw人人养虾:Cron vs 心跳 - 调度策略对比
  • 革新Windows Android应用体验:无缝集成与效率提升的完美方案
  • 成都二手房装修哪家靠谱?厨卫翻新改造/精装房微改哪家好? - 成都人评鉴
  • 零基础入门linux:用快马ai一键生成ubuntu20.04交互式安装教程
  • 如何用开源工具解除音乐加密限制?解锁音频文件的完整指南
  • 从电机到USB:一文搞懂嵌入式里的感性负载、容性负载与阻抗匹配(附功率因数校正实例)
  • 1. CAN总线简介
  • 避免PCB设计翻车!Allegro铜皮编辑中的5个常见错误及解决方法
  • OpenClaw人人养虾:办公自动化合集案例
  • 利用快马AI快速生成Android Studio天气预报应用原型