注解详解系列 - @Primary:优先选择的Bean

注解简介

在今天的注解详解系列中,我们将探讨@Primary注解。@Primary是Spring框架中的一个重要注解,用于在有多个候选Bean时指定首选的Bean。通过@Primary注解,可以明确地告诉Spring容器在注入依赖时选择哪个Bean。


注解定义

@Primary注解用于指定当有多个候选Bean时,首选的Bean。它通常应用于类级别或方法级别,通常与@Component@Service@Repository@Bean等注解一起使用。以下是一个基本的示例:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;@Configuration
public class AppConfig {@Bean@Primarypublic MyService primaryService() {return new MyService("Primary Service");}@Beanpublic MyService secondaryService() {return new MyService("Secondary Service");}
}class MyService {private String name;public MyService(String name) {this.name = name;}public void printServiceName() {System.out.println("Service Name: " + name);}
}

在这个示例中,primaryService Bean被标记为首选的Bean,因为它被注解了@Primary


注解详解

@Primary注解是Spring框架中用于指定首选Bean的注解。它的主要功能是当有多个候选Bean时,明确指定Spring容器应该选择哪个Bean进行注入。

@Primary注解的作用包括:

  • 指定首选Bean:在有多个候选Bean时,指定首选的Bean。
  • 减少冲突:在依赖注入时减少Bean冲突和歧义。
  • 简化配置:使得在多Bean场景下的配置更加简单和明确。

@Primary注解通常与@Component@Service@Repository@Bean等注解一起使用,以标记需要优先选择的Bean。


使用场景

@Primary注解广泛用于Spring应用程序中,用于在有多个同类型的候选Bean时指定首选的Bean。例如,在多个数据源、多个服务实现或多个策略模式实现时,可以使用@Primary注解来指定首选的Bean。


示例代码

以下是一个使用@Primary注解的代码示例,展示了如何通过Spring指定首选的Bean:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;@Configuration
public class AppConfig {@Bean@Primarypublic MyService primaryService() {return new MyService("Primary Service");}@Beanpublic MyService secondaryService() {return new MyService("Secondary Service");}
}@Component
public class MyApp {private final MyService myService;@Autowiredpublic MyApp(MyService myService) {this.myService = myService;}public void run() {myService.printServiceName();}
}

在这个示例中:

  • primaryService被标记为首选的Bean,因为它被注解了@Primary
  • MyApp类中自动注入的myService实例将会是primaryService

使用Spring Boot的首选Bean

在Spring Boot项目中,可以通过@Primary注解和Spring配置文件来指定首选的Bean。例如,通过以下方式在配置文件中定义首选的Bean:

application.properties文件内容:

spring.bean.primary=primaryService

通过这种方式,可以在Spring Boot项目中方便地定义和管理首选的Bean。


常见问题

问题:如何在有多个候选Bean时,手动指定注入的Bean?

解决方案:可以使用@Qualifier注解手动指定注入的Bean。以下是一个示例:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;@Configuration
public class AppConfig {@Bean@Primarypublic MyService primaryService() {return new MyService("Primary Service");}@Beanpublic MyService secondaryService() {return new MyService("Secondary Service");}
}@Component
public class MyApp {private final MyService myService;@Autowiredpublic MyApp(@Qualifier("secondaryService") MyService myService) {this.myService = myService;}public void run() {myService.printServiceName();}
}

在这个示例中:

  • MyApp类中通过@Qualifier注解手动指定注入secondaryService Bean。

问题:如何在测试中验证首选的Bean?

解决方案:可以通过Spring的依赖注入和测试框架来验证首选的Bean。例如,通过JUnit测试框架,可以验证@Primary注解指定的首选Bean。

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class PrimaryBeanTest {@Autowiredprivate MyService myService;@Testpublic void testPrimaryBean() {assertEquals("Primary Service", myService.printServiceName());}
}

在这个示例中:

  • testPrimaryBean方法验证@Primary注解指定的首选Bean是否被正确注入。

小结

通过今天的学习,我们了解了@Primary的基本用法和应用场景,以及如何在Spring Boot框架中指定首选的Bean。明天我们将探讨另一个重要的Spring注解——@DependsOn


相关链接
  • Spring 官方文档
  • Spring Bean 优先选择
  • Spring Boot Bean 优先选择

希望这个示例能帮助你更好地理解和应用@Primary注解。如果有任何问题或需要进一步的帮助,请随时告诉我。

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

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

相关文章

CTF-蓝帽杯 2022 初赛Misc计算机取证题目详解

使用工具:Volatility、Passware Kit、Arsenal Image Mounter、DiskGenius 题目文件如下: 首先要知道这些文件是什么: dmp后缀指Dump文件,是windows系统中的错误转储文件。包含计算机程序运行时的内存信息的文件。通常操作系统或…

uniapp的picker组件:解决多个uv-picker时,每个picker高亮的内容显示不是已选择项的问题

先看看是不是你想要的: 解决前: uv-picker解决高亮和已选择项不同的问题 解决后: 解决后的uv-picker高亮及选择项 背景: 此项目是使用vue3uniapp开发的h5项目,项目的某个页面有两个或多个下拉选项,选择的第…

37.自定义协议

自定义协议要素 1.魔数:用来第一时间判定是否是无效数据包。 2.版本号:主持协议升级。 3.序列化算法:消息正文到底采用那种序列化方式,可以由此扩展,例如:json,protobuf(google的序列化算法,基于二进制,虽然可读性不好,但是字节数占用更少),hessian(基于二进制)…

【Git】win本地 git bash:Connect reset by 20.205.243.166 port22报错问题解决

win10 git bash 控制台 reset 22端口拒绝连接问题: Connection reset by 20.205.243.166 port 221、22端口 无法连接 ssh -T gitgithub.com2、尝试用443端口 仍然无法连接 ssh -T -P 443 gitgithub.com3、重写 git clone 地址 url,全局添加 https 前缀…

每日一题——Python代码实现力扣1. 两数之和(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 菜鸡写法 代码分析 时间复杂度分析 空间复杂度分析 改进建议 我要更强 方法1: 使…

samba服务器配置(非常详细)

1、安装Samba软件包 sudo apt-get install samba samba-common 2、修改Samba配置文件,配置共享信息 2.1、打开配置文件: sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak//为了防止配置错误,可以先进行备份 sudo vim /etc/samba/smb.conf //对配置文件进行修改 …

服务器监控:运维行业的核心保障与第三方监控软件的选择

随着信息技术的飞速发展,企业IT架构日益复杂,服务器作为整个IT系统的核心,其稳定性和性能对业务的连续性至关重要。在运维行业中,服务器监控作为保障服务器稳定运行的关键环节,已经受到了越来越多企业的重视。本文将探…

自然语言处理领域的明星项目推荐:Hugging Face Transformers

在当今人工智能与大数据飞速发展的时代,自然语言处理(NLP)已成为推动科技进步的重要力量。而在NLP领域,Hugging Face Transformers无疑是一个备受瞩目的开源项目。本文将从项目介绍、代码解释以及技术特点等角度,为您深…

shiny在服务器上部署

将一个Shiny应用程序部署到服务器上可以通过多种方式实现,包括使用Shiny Server、Shinyapps.io或者Docker。以下是如何使用Shiny Server在服务器上部署Shiny应用程序的详细步骤。 步骤 1: 准备服务器环境 确保你的服务器运行的是Ubuntu或其他Linux发行版&#xff…

气膜建筑:持久耐用的建筑选择—轻空间

随着科技的发展,气膜建筑以其快速施工、节能环保和灵活多用的特点,正在各个领域获得越来越多的应用。然而,许多人对气膜建筑的耐用程度仍存有疑虑。本文将从气膜建筑的材料、结构设计和维护等方面,深入探讨气膜建筑的耐用性&#…

EndNote 21 for Mac v21.3 文献管理软件安装

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行安装EndNote212、升级 三、运行1、打开软件,测试 安装完成!!!四、注意事项 效果 一、下载软件 下载软件 链接:http://www.macfxb.cn 二、开始安装 1、双击…

无霍尔BLDC驱动

目前主要的无霍尔控制方案是基于反电势检测信 息判断换相点,本文研究反电势在 PWM - OFF 点的检 测方案确定换相点。 1. 反电动势检测方案 BLDC 的模型做等效,将线圈阻抗看成是一个 线性电阻和一个储能电感的等效,其等效电路图如图 1所示。 电机三相绕组输出端电压的电压…

Typora + Hexo 图片路径问题(Typedown)

文章目录 1. 冲突来源2. 解决思路3. 实现1. typora图片路径2. hexo脚本 1. 冲突来源 Hexo上对于图片在md中的引用,使用了post_asset_folder: true配置,来更好的管理图片。 当一篇名为xxx.md的文章引用1.png图片时,默认让1.png保持在xxx文件夹…

ssh在本地虚拟机中的应用——解决虚拟机中编写和阅读代码不方便问题的一个小技巧

虚拟机中编程小技巧分享——ssh的使用 事情的起因是这样的:前几天一位工程师过来我这边,他看到我在主机和虚拟机运行了两个vscode环境,不经意间提了句:“这么艰苦的环境写代码啊”。 后来我一想:确实。 我长时间以来…

热电阻温度计的测量电路

热电阻温度计的测量电路,为达到高精度测量,通常会采用电桥测量原理,并结合适当的热电阻类型和连接方式。 惠斯通电桥是用于测量一组电阻式元件阻值变化的电路。该电路具有两个并联电阻支路,充当激励电压 VEXCITATION 的分压器。每…

关于C# KeyUp事件中MessageBox的回车(Enter)按键的回调问题(禁止无限按ENTER)

在textbox中的keyup事件如果编写带有messbox的代码触发事件后再按enter会无限回调messbox,如何禁止回调messbox中enter呢,解决方案如下: 把textbox中keyup事件中的代码移植到 keydown事件中 如 : private void txtNum_KeyDown(ob…

帕金森综合征的预防方法

帕金森综合征是一种慢性神经退行性疾病,目前尚无法彻底治愈。然而,通过采取一些预防措施,可以降低患病风险或延缓病情发展。以下是一些基于最新研究和医学建议的预防方法: 健康饮食:保持低盐、低脂饮食,多吃…

二叉树经典OJ题

目录 判断两棵二叉树是否相同单值二叉树判断对称二叉树另一棵树的子树二叉树遍历判断完全二叉树 判断两棵二叉树是否相同 力扣上忽然找不到这个题了,大家先看代码吧: 首先要注意的是,两棵树的前序遍历结果一样时,结构可能是不同…

期货交易纪律2024年6月22号

文章目录 期货交易系统构建第一步、选品第二步、开仓纪律第三步、持仓 2024年6月22号,开始写期货交易的第三篇日记。 交易记录:市场继续震荡,这两天无交易,继续梳理一些期货交易选品,周末详细的了解了一下豆粕&#xf…

vue3+element ui +ts 封装周范围选择器

vue3element ui ts 封装周范围选择器 在业务场景中,产品需要在页面中使用周范围选择器,我们在使用ant-design的时候里面是有自带的,但是在emement中只有指定周的范围选择器: 这个是ant-design的周范围选择器 这个是element ui 的…