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

Spring中@Primary注解的作用与使用

在 Spring 框架中,@Primary 注解用于解决依赖注入时的歧义性(Ambiguity)问题。当 Spring 容器中存在多个相同类型的 Bean 时,通过 @Primary 标记其中一个 Bean 作为默认的首选注入对象


核心作用:

  1. 解决多个同类型 Bean 的冲突
    当有多个实现同一接口或相同类型的 Bean 时,Spring 无法自动确定注入哪个 Bean,会抛出 NoUniqueBeanDefinitionException。使用 @Primary 可指定默认注入的 Bean。

  2. 隐式选择优先级
    被标记为 @Primary 的 Bean 会被优先注入,无需额外使用 @Qualifier 指定名称。


使用示例:

场景定义

假设有一个支付接口 PaymentService 和两个实现类:

public interface PaymentService {void pay();
}@Component
public class CreditCardService implements PaymentService {@Overridepublic void pay() { System.out.println("信用卡支付"); }
}@Component
public class AlipayService implements PaymentService {@Overridepublic void pay() { System.out.println("支付宝支付"); }
}
问题:依赖注入歧义

若直接注入 PaymentService,Spring 会报错:

@Autowired
private PaymentService paymentService; // 抛出 NoUniqueBeanDefinitionException
解决方案:使用 @Primary

标记其中一个实现类为默认首选:

@Component
@Primary // 指定为默认注入的 Bean
public class AlipayService implements PaymentService { ... }

此时注入会成功选择 AlipayService

@Autowired
private PaymentService paymentService; // 隐式注入 AlipayService

与其他注解的优先级:

  1. @Primary vs @Qualifier

    • @Qualifier 显式指定 Bean 名称的优先级高于 @Primary
    • 例如:@Autowired @Qualifier("creditCardService") 会覆盖 @Primary
  2. 多个 @Primary 的冲突
    如果多个同类型 Bean 都被标记为 @Primary,Spring 会再次抛出歧义异常。


常见使用场景:

  1. 数据库多数据源配置
    在多个 DataSource Bean 中,标记默认使用的数据源。
  2. 不同环境下的实现类
    例如在测试和生产环境中提供同一接口的不同实现,通过 @Primary 切换默认实现。
  3. 第三方库的扩展
    当覆盖第三方库提供的 Bean 时,将自己的实现标记为 @Primary

配置方式:

除了注解在类上,也可以在 @Bean 方法中使用:

@Configuration
public class AppConfig {@Bean@Primary // 标记此 Bean 为首选public PaymentService alipayService() {return new AlipayService();}
}

总结:

场景解决方案
多个同类型 Bean,需默认注入一个在目标 Bean 添加 @Primary
需要临时覆盖默认注入配合 @Qualifier 指定名称

关键点@Primary 是 Spring 解决依赖注入歧义性的轻量级方案,通过隐式指定默认 Bean 简化配置,但在需要精确控制的场景中仍需结合 @Qualifier 使用。

相关文章:

Spring中@Primary注解的作用与使用

在 Spring 框架中,Primary 注解用于解决依赖注入时的歧义性(Ambiguity)问题。当 Spring 容器中存在多个相同类型的 Bean 时,通过 Primary 标记其中一个 Bean 作为默认的首选注入对象。 核心作用: 解决多个同类型 Bean …...

Spring Boot + Elasticsearch + HBase 构建海量数据搜索系统

Spring Boot Elasticsearch HBase 构建海量数据搜索系统 📖 目录 1. 系统需求分析2. 系统架构设计3. Elasticsearch 与 HBase 集成方案4. Spring Boot 项目实现5. 大规模搜索系统最佳实践 项目概述 本文档提供了基于 Spring Boot、Elasticsearch 和 HBase 构建…...

[zynq] Zynq Linux 环境下 AXI BRAM 控制器驱动方法详解(代码示例)

Zynq Linux 环境下 AXI BRAM 控制器驱动方法详解 文章目录 Zynq Linux 环境下 AXI BRAM 控制器驱动方法详解1. UIO (Userspace I/O) 驱动方法完整示例代码 2. /dev/mem 直接内存映射方法完整示例代码 3. 自定义字符设备驱动方法完整示例代码 4. 方法对比总结5. 实战建议 在 Zyn…...

【大模型:知识图谱】--5.neo4j数据库管理(cypher语法2)

目录 1.节点语法 1.1.CREATE--创建节点 1.2.MATCH--查询节点 1.3.RETURN--返回节点 1.4.WHERE--过滤节点 2.关系语法 2.1.创建关系 2.2.查询关系 3.删除语法 3.1.DELETE 删除 3.2.REMOVE 删除 4.功能补充 4.1.SET (添加属性) 4.2.NULL 值 …...

六、数据库的安全性

六、数据库的安全性 数据库的安全问题 数据库中的数据是可以共享的数据共享必然带来数据库的安全性问题 数据库系统中的数据共享不能是无条件的共享数据库中数据的共享是在 DBMS 统一的严格控制之下的共享,即:只允许有合法使用权限的用户访其被授权的数…...

贪心算法应用:装箱问题(BFD算法)详解

贪心算法应用&#xff1a;装箱问题(BFD算法)详解 1. 装箱问题与BFD算法概述 1.1 装箱问题定义 装箱问题(Bin Packing Problem)是组合优化中的经典问题&#xff0c;其定义为&#xff1a; 给定n个物品&#xff0c;每个物品有大小wᵢ (0 < wᵢ ≤ C)无限数量的箱子&#xf…...

C#学习第27天:时间和日期的处理

时间和日期的核心概念 1. UTC 和 本地时间 UTC&#xff08;Coordinated Universal Time&#xff09;&#xff1a; 是一种不受时区影响的世界标准时间。在网络通信和全球协作中&#xff0c;用于统一时间度量 本地时间&#xff08;Local Time&#xff09;&#xff1a; 是根据所…...

编程技能:格式化打印05,格式控制符

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;编程技能&#xff1a;格式化打印04&#xff0c;sprintf 回到目录…...

MPLAB X IDE ​软件安装与卸载

1、下载MPLAB X IDE V6.25 MPLAB X IDE | Microchip Technology 正常选Windows&#xff0c;点击Download&#xff0c;等待自动下载完成&#xff1b; MPLAB X IDE 一台电脑上可以安装多个版本&#xff1b; 2、安装MPLAB X IDE V6.25 右键以管理员运行&#xff1b;next; 勾选 I a…...

windows编程实现文件拷贝

项目源码链接&#xff1a; 实现文件拷贝功能&#xff08;限制5GB大小&#xff09; 81c57de 周不才/cpp_linux study - Gitee.com 知识准备&#xff1a; 1.句柄 句柄是一个用于标识和引用系统资源&#xff08;如文件、窗口、进程、线程、位图等&#xff09;的值。它不是资…...

[6-01-01].第12节:字节码文件内容 - 属性表集合

JVM学习大纲 二、属性表集合&#xff1a; 2.1.属性计数器&#xff1a; 2.2.属性表&#xff1a; 2.3.字节码文件组成5 -> 属性&#xff1a; 1.属性主要指的是类的属性&#xff0c;比如源码的文件名、内部类的列表等 2.4.字节码文件组成3 -> 字段&#xff1a; 1.字段中…...

基于机器学习的水量智能调度研究

摘要&#xff1a;随着城市化进程的加速和水资源供需矛盾的日益突出&#xff0c;传统的水量调度模式因缺乏精准预测和动态调控能力&#xff0c;难以满足现代供水系统对高效性、稳定性和节能性的要求。本文针对供水系统中用水峰谷预测不准确、能耗高、供需失衡等核心问题&#xf…...

深度解码:我如何用“结构进化型交互学习方法”与AI共舞,从学习小白到构建复杂认知体系

嗨&#xff0c;亲爱的学习者们&#xff0c;思考者们&#xff0c;以及所有渴望在知识海洋中自由翱行却时常感到迷茫的朋友们&#xff1a; 你是否也曾有过这样的深夜&#xff0c;面对堆积如山的学习资料&#xff0c;眼神迷离&#xff0c;内心却一片荒芜&#xff1f;明明每个字都…...

深入浅出 Scrapy:打造高效、强大的 Python 网络爬虫

在数据为王的时代,高效获取网络信息是开发者必备的技能。今天我将为大家介绍 Python 爬虫领域的王者框架——Scrapy。无论你是数据工程师、分析师还是开发者,掌握 Scrapy 都能让你的数据采集效率提升数倍! 项目地址:https://github.com/scrapy/scrapy 官方文档:https://do…...

ES6 Promise 状态机

状态机&#xff1a;抽象的计算模型&#xff0c;根据特定的条件或者信号切换不同的状态 一、Promise 是什么&#xff1f; 简单来说&#xff0c;Promise 就是一个“承诺对象”。在ES6 里&#xff0c;有些代码执行起来需要点时间&#xff0c;比如加载文件、等待网络请求或者设置…...

Axure 与 Cursor 集成实现方案

Axure 与 Cursor 集成实现方案 以下是一个完整的 Axure 与 Cursor AI 集成的原型实现方案&#xff0c;通过自定义 JavaScript 代码实现无缝对接&#xff1a; 一、整体架构设计 #mermaid-svg-f9hQDSN4hijU3mJY {font-family:"trebuchet ms",verdana,arial,sans-seri…...

汽车加气站操作工证考试重点

汽车加气站操作工证考试重点 一、汽车加气站操作工证考试主要内容 汽车加气站操作工证是从事CNG&#xff08;压缩天然气&#xff09;和LNG&#xff08;液化天然气&#xff09;加气站作业人员的必备资格证书。随着新能源汽车的快速发展&#xff0c;该证书的市场需求持续增长&a…...

贪心算法应用:带权任务间隔调度问题详解

贪心算法应用&#xff1a;带权任务间隔调度问题详解 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法。带权任务间隔调度问题是贪心算法的一个经典应用场景。 问题定义…...

用电脑控制keysight示波器

KEYSIGHT示波器HD304MSO性能 亮点&#xff1a; 体验 200 MHz 至 1 GHz 的带宽和 4 个模拟通道。与 12 位 ADC 相比&#xff0c;使用 14 位模数转换器 &#xff08;ADC&#xff09; 将垂直分辨率提高四倍。使用 10.1 英寸电容式触摸屏轻松查看和分析您的信号。捕获 50 μVRMS …...

LLaMA-Factory - 批量推理(inference)的脚本

scripts/vllm_infer.py 是 LLaMA-Factory 团队用于批量推理&#xff08;inference&#xff09;的脚本&#xff0c;基于 vLLM 引擎&#xff0c;支持高效的并行推理。它可以对一个数据集批量生成模型输出&#xff0c;并保存为 JSONL 文件&#xff0c;适合大规模评测和自动化测试。…...

React从基础入门到高级实战:React 高级主题 - 测试进阶:从单元测试到端到端测试的全面指南

React 测试进阶&#xff1a;从单元测试到端到端测试的全面指南 引言 在2025年的React开发环境中&#xff0c;测试不仅是代码质量的保障&#xff0c;更是提升开发效率和用户体验的关键支柱。随着React应用的复杂性不断增加&#xff0c;高级测试技术——如端到端&#xff08;E2…...

Ansible 剧本精粹 - 编写你的第一个 Playbook

Ansible 剧本精粹 - 编写你的第一个 Playbook 如果说 Ansible Ad-Hoc 命令像是你对厨房里的助手发出的零散口头指令(“切个洋葱”、“烧开水”),那么 Playbook 就是一份完整、详细、写在纸上的菜谱。它列明了所有需要的“食材”(变量),详细的“烹饪步骤”(任务),甚至还…...

【Elasticsearch】Elasticsearch 核心技术(二):映射

Elasticsearch 核心技术&#xff08;二&#xff09;&#xff1a;映射 1.什么是映射&#xff08;Mapping&#xff09;1.1 元字段&#xff08;Meta-Fields&#xff09;1.2 数据类型 vs 映射类型1.2.1 数据类型1.2.2 映射类型 2.实际运用案例案例 1&#xff1a;电商产品索引映射案…...

【计算机网络】网络层协议

1. ICMP协议的介绍及应用 IP协议的助手 —— ICMP 协议 ping 是基于 ICMP 协议工作的&#xff0c;所以要明白 ping 的工作&#xff0c;首先我们先来熟悉 ICMP 协议。 ICMP 全称是 Internet Control Message Protocol&#xff0c;也就是互联网控制报文协议。 里面有个关键词 …...

.NET Core接口IServiceProvider

.NET Core 接口 IServiceProvider 深度剖析 在 .NET Core 和 .NET 5 的世界里&#xff0c;依赖注入&#xff08;Dependency Injection&#xff0c;简称 DI&#xff09;是构建可维护、可测试应用程序的关键技术。而 IServiceProvider 接口&#xff0c;正是依赖注入机制中的核心…...

结构型设计模式之Proxy(代理)

结构型设计模式之Proxy&#xff08;代理&#xff09; 前言&#xff1a; 代理模式&#xff0c;aop环绕通知&#xff0c;动态代理&#xff0c;静态代理 都是代理的一种&#xff0c;这次主要是记录设计模式的代理demo案例&#xff0c;详情请看其他笔记。 1&#xff09;意图 为其…...

案例分享--汽车制动卡钳DIC测量

制动系统是汽车的主要组成部分&#xff0c;是汽车的主要安全部件之一。随着车辆性能的不断提高&#xff0c;车速不断提升&#xff0c;对车辆的制动系统也随之提出了更高要求&#xff0c;因此了解车辆制动系统中每个部件的动态行为成为了制动系统优化的主要途径&#xff0c;同时…...

Redis Set集合命令、内部编码及应用场景(详细)

文章目录 前言普通命令SADDSMEMBERSSISMEMBERSCARDSPOPSMOVESREM 集合间操作SINTERSINTERSTORESUNIONSUNIONSTORESDIFFSDIFFSTORE 命令小结内部编码使用场景 前言 集合类型也是保存多个字符串类型的元素的&#xff0c;但和列表类型不同的是&#xff0c;集合中 1&#xff09;元…...

C++算法动态规划1

DP定义&#xff1a; 动态规划是分治思想的延申&#xff0c;通俗一点来说就是大事化小&#xff0c;小事化无的艺术。 在将大问题化解为小问题的分治过程中&#xff0c;保存对这些小问题已经处理好的结果&#xff0c;并供后面处理更大规模的问题时直接使用这些结果。 动态规划具…...

【快速预览经典深度学习模型:CNN、RNN、LSTM、Transformer、ViT全解析!】

&#x1f680;快速预览经典深度学习模型&#xff1a;CNN、RNN、LSTM、Transformer、ViT全解析&#xff01; &#x1f4cc;你是否还在被深度学习模型名词搞混&#xff1f;本文带你用最短时间掌握五大经典模型的核心概念和应用场景&#xff0c;助你打通NLP与CV的任督二脉&#xf…...