Spring中@Primary注解的作用及小demo演示

news/2025/9/23 14:39:13/文章来源:https://www.cnblogs.com/dongyaotou/p/19107165

Spring中@Primary注解的作用及小demo演示

一、@Primary注解的核心作用

@Primary是Spring框架中用于解决依赖注入歧义问题的注解,当容器中存在多个相同类型的Bean时,Spring无法自动决定注入哪一个,此时通过@Primary标记某个Bean为“首选”,注入时会优先选择该Bean。其核心价值在于简化默认Bean的选择逻辑,避免在每个注入点都使用@Qualifier显式指定。

二、@Primary的典型使用场景

  1. 多实现类冲突:一个接口有多个实现类(如UserServiceUserServiceImplAUserServiceImplB),希望默认注入其中一个;

  2. 多数据源配置:项目中需要连接多个数据库(如MySQL和PostgreSQL),设置其中一个为默认数据源;

  3. 第三方库集成:避免第三方库的Bean与自定义Bean冲突,通过@Primary指定优先使用的实现。

三、小demo演示(接口多实现场景)

1. 定义接口与实现类

假设我们有一个MessageService接口,用于发送消息,有两个实现类:EmailMessageService(发送邮件)和SmsMessageService(发送短信)。

// 接口定义
public interface MessageService {void sendMessage(String content);
}// 邮件服务实现(默认首选)
@Component
@Primary
public class EmailMessageService implements MessageService {@Overridepublic void sendMessage(String content) {System.out.println("【邮件】发送消息:" + content);}
}// 短信服务实现
@Component
public class SmsMessageService implements MessageService {@Overridepublic void sendMessage(String content) {System.out.println("【短信】发送消息:" + content);}
}

2. 注入并使用接口

创建一个MessageController,通过构造器注入MessageService,无需指定具体实现:

@Component
public class MessageController {private final MessageService messageService;@Autowiredpublic MessageController(MessageService messageService) {this.messageService = messageService;}public void send() {messageService.sendMessage("Hello, Spring @Primary!");}
}

3. 运行结果

启动Spring应用(如通过AnnotationConfigApplicationContext加载配置),调用MessageController.send()方法,输出结果为:

【邮件】发送消息:Hello, Spring @Primary!

原因EmailMessageService被标记为@Primary,Spring在注入MessageService时优先选择了它。若移除@Primary注解,Spring会抛出NoUniqueBeanDefinitionException(多个相同类型Bean无法确定注入哪一个)。

四、关键说明

  • 与@Qualifier的区别@Primary全局默认选择(适用于所有注入点),而@Qualifier局部显式指定(需在注入时明确指定Bean名称,如@Qualifier("smsMessageService"));

  • 配置类中使用:若Bean通过@Bean方法手动创建,同样可以在方法上添加@Primary(如@Bean @Primary public MessageService emailMessageService())。

通过这个小demo,可以清晰看到@Primary如何解决多Bean注入的歧义问题,简化默认Bean的选择流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/912866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

站长工具seo综合查询张家界新娘抖音代运营协议合同范本

data [0.1869, 0.1900, 0.1878, 0.1847]; b bar(data); ch get(b,children); set(gca,XTickLabel,{非加权聚类欧氏距离类比,非加权聚类马氏距离类比,加权聚类欧氏距离类比,加权聚类马氏距离类比}) set(ch,FaceVertexCData,[1 1 1;1 1 1;1 1 1;1 1 1;])

网站运营主要做什么亚马逊雨林在地图上的位置

探索AI视频创新:Sora的奇迹 随着科技的不断演进,AI视频模型已经成为人工智能领域的一颗新星。在这场技术的风暴中,OpenAI的Sora模型以其杰出的性能和前瞻性的技术脱颖而出,正引领着AI视频领域的全新创新浪潮。 Sora的技术之光 …

建设网站一般要多少钱中国建设银行人才招聘

Runtime v2 为运行时作者集成 containerd 引入了一级 shim API。 containerd 作为守护进程,并不直接启动容器。相反,它充当更高级别的管理器 或枢纽的作用,以协调容器和内容的活动。被称作 "运行时"的程序真正来启动、停止和管理容…

三明做网站wordpress 百度云视频

命令可以看到单个进程能够打开的最大文件句柄数量(socket连接也算在里面)。系统默认值1024。对于一般的应用来说(象Apache、系统进程)1024完全足够使用。但是如何象squid、mysql、java等单进程处理大量请求的应用来说就有点捉襟见肘了。如果单个进程打开的文件句柄数量超过了系…

东莞做网站建设wordpress 安装出错

1.总结 目的:想要在故障恢复后不丢数据 输入端 保证可以重复发送数据如果是kafka,Flink负责维护offset,不用kafka维护设置kafka的隔离级别为:读已提交flink 开启检查点采用对齐或者不对齐的精确一次输出端 kafka 幂等事务两阶段…

腾讯免费网站空间西昌seo

1.正常卸载MySQL数据库 2.将 C:/ProgramData 目录下的子目录 MySQL 删除 注意:目录 ProgramData 是隐藏目录,你正常情况下看不到,你可以在文件地址栏输入 C:/ProgramData 进入该目录下。

佛山美容网站建设摄影app

你好,这里是 Dotnet 工具箱,定期分享 Dotnet 有趣,实用的工具或组件,希望对您有用!简介 ABP-MicroService是 一个基于ABP vNext微服务架构、vue-element-admin的后台管理框架,适用于大型分布式业务系统和企…

elementor做视频网站多个wordpress用户

文章目录 概念介绍设置方法示例代码内容总结 我们在上一章回中介绍了Card Widget相关的内容,本章回中将介绍国际化设置.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在这里说的国际化设置是指在App设置相关操作,这样可以让不同国家的…

2025年9月16日纸质证书 - 宋同学PostgreSQL管理员(中级)认证

2025年9月16日 宋同学PostgreSQL中级认证证书【纸质版】为什么选择工信人才PostgreSQL认证:发证机构:工信部人才交流中心属于工信部直属的二类事业单位,证书的权威性更高;应用领域:工信人才所发的PG认证隶属于信息…

C# 18天 029 依赖注入

依赖注入需要依赖注入的框架using Microsoft.Extensions.DependencyInjection;可以向serviceConllection 要每次是要同一个单例呢还是要重新创建一个呢

ruoyi-vue列表显示关联

之前我们讲解了如何使用ruoyi去自动生成代码,自动做成菜单,增删改查的功能都有了,现在我们来做点改进,比如这里需要显示正确的姓名。 而且同时我们还想让这个自增长编号这一列不再显示,那么我们需要打开这段html的…

自定义网关选择后端的微服务实例实现

自定义网关选择后端的微服务实例实现1.概述 我们在使用微服务时,比如我们后端部署了很多台微服务实例,比如订单 10台,库存1O台,其中每两台服务有一个客户,就是一个客户只可以使用其中的两台微服务实例,因此我们需…

VUE3切换页面时,页面没有加载

初学VUE开发,遇到这个问题.在从A页面切换到B页面时,B页面没有加载.但是从C页面加载B页面是正常的 最终问题是 页面结构 必须是template 里必须用一个最大的 div 包裹

专业网站建设收费建设部网站如何下载规范 标准

kafka基本概念 Producer 生产者:负责将消息发送到 BrokerConsumer 消费者:从 Broker 接收消息Consumer Group 消费者组:由多个 Consumer 组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费&am…

建设网站目的是什么定制化网站一般价格

断点下载 GET 当服务端收到GET请求,服务端不会把整个对象返回给客户端,服务端首先做SEEK,查找客户端提供的Range: bytesfirst的字节数,从0-first的内容服务端直接丢弃,那么服务端从first开始传递数据 POST 如果客户…

炫彩发光字制作网站优猫券网站怎么做

Knife4j是一个集Swagger2 和 OpenAPI3为一体的增强解决方案,官网地址:Knife4j 集Swagger2及OpenAPI3为一体的增强解决方案. | Knife4j 考虑到安全性问题,在实际服务部署到生产环境后就需要禁用到swagger页面的展示,这个时候只需…

wordpress多站点 文章导入清溪镇网站建设

1、制冷系统安全运行的三个必要条件是什么? 答: (1)系统内的制冷剂压力不得出现异常高压,以免设备破裂。 (2)不得发生(可能导致)湿冲程、液爆、液击等误操作,以免设备破…

从零开始学做网站cdsn取个网站建设公司名字

在当今数字化时代,电子商务行业日新月异,抖音电商作为新兴的电商形式,正逐渐展现出其强大的市场潜力。四川尚熠电子商务有限公司,正是这一浪潮中的佼佼者,以其专业的抖音电商服务,赢得了广大消费者的信赖和…

大方做网站天津科技制造有限公司

记录微信小程序预览pdf文件,修改pdf名字安卓和ios都可用。 1.安卓和苹果的效果 2.需要用到的api 1.wx.downloadFile wx.downloadFile 下载文件资源到本地。客户端直接发起一个 HTTPS GET 请求,返回文件的本地临时路径 (本地路径),单次下载…

服饰类电商网站建设策划dw做的个人网站

获取元组的下标对应的值 注意元组是不可以修改值的,只能获取不能修改 但是列表是可以修改值的对吧