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

在Spring Boot中具有多个实现的接口正确注入的六种方式

 ​

博客主页:     南来_北往

系列专栏:Spring Boot实战


在Spring Boot中,当一个接口具有多个实现时,正确地将这些实现注入到需要使用它们的地方是一个常见的需求。以下是在Spring Boot中实现这一目标的六种方式:

1. 使用@Autowired和@Qualifier注解

这是最直接的方法。在需要注入接口实现的地方,使用@Autowired注解,并通过@Qualifier注解指定要注入的具体实现。

@Autowired  
@Qualifier("specificImplementation")  
private MyInterface myInterface;

在这里,“specificImplementation”是你在某个实现类上使用@Service@Component注解时指定的bean名称。

2. 使用@Resource注解

@Resource注解默认按名称(byName)进行注入,如果找不到匹配的bean,则按类型(byType)进行注入。这种方式可以简化代码,因为你不需要显式地使用@Qualifier

@Resource(name = "specificImplementation")  
private MyInterface myInterface;

3. 通过构造方法注入

在构造方法中声明需要注入的接口实现,Spring会在初始化bean时自动将对应的实现传入。

private final MyInterface myInterface;  @Autowired  
public MyClass(MyInterface myInterface) {  this.myInterface = myInterface;  
}

这种方式是类型安全的,并且可以在构造函数中立即进行依赖检查。

4. 使用@Primary注解

当你有多个实现,但其中一个实现是主要的或默认的,你可以在该实现上使用@Primary注解。这样,当Spring在自动装配时遇到多个候选者时,会优先选择标记了@Primary的实现。

@Primary  
@Service  
public class PrimaryImplementation implements MyInterface {  // 实现方法  
}

然后在需要注入的地方直接使用@Autowired

5. 使用Java配置类

在Java配置类中,你可以显式地声明要注入的bean,并使用@Bean注解将其注册到Spring容器中。

@Configuration  
public class MyConfig {  @Bean  @Primary  public MyInterface primaryImplementation() {  return new PrimaryImplementation();  }  @Bean  public MyInterface secondaryImplementation() {  return new SecondaryImplementation();  }  
}

在需要注入的地方,你可以像之前一样使用@Autowired,并且如果使用了@Primary,则会自动注入主要的实现。

6. 注入所有实现到List或Map中

Spring可以将一个接口的所有实现类注入到一个List或Map中。这在你需要遍历所有实现或根据某些条件选择实现时非常有用。

@Autowired  
private List<MyInterface> allImplementations;  // 或者  @Autowired  
private Map<String, MyInterface> allImplementationsByName;

在这种情况下,你不需要在每个实现上使用@Qualifier@Primary注解。Spring会自动将所有实现注入到List或Map中。

总结

以上六种方法各有优缺点,选择哪种方法取决于你的具体需求和偏好。在大多数情况下,使用@Autowired@Qualifier注解是最直接和灵活的方式。然而,在某些情况下,使用@Primary注解、构造方法注入或Java配置类可能更合适。最后,将接口的所有实现注入到List或Map中提供了一种处理多个实现的强大方式。

相关文章:

在Spring Boot中具有多个实现的接口正确注入的六种方式

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在Spring Boot中&#xff0c;当一个接口具有多个实现时&#xff0c;正确地将这些实现注入到需要使用它们的地方是一个常见的需求。以下是在Spring Boot中实现这一目标的六种方式&#xff1a; 1. 使用Autowir…...

登陆微软账户太慢了,如何解决

软账号登录慢解决办法&#xff1a; 打开“网络和Internet”选择“以太网”选择“更改适配器选项”选择现用网络&#xff0c;右键->属性选择“IPV4”右键属性更改DNS地址为以下两者4.2.2.14.2.2.2...

Vue3动态组件component不生效问题解决方法

问题&#xff1a; vue3循环渲染动态组件component不生效&#xff0c;页面空白 在vue3使用component动态组件展示组件时&#xff0c;组件就是不展示显示空白。在vue2中使用动态变量component展示组件都是没问题。试了很多方法 踩了很多坑&#xff0c;所以记录下&#xff1a; 登录…...

算力基础篇:从零开始了解算力

什么是算力 算力即计算能力&#xff08;Computing Power&#xff09;&#xff0c;狭义上指对数字问题的运算能力&#xff0c;而广义上指对输入信息处理后实现结果输出的一种能力。虽然处理的内容不同&#xff0c;但处理过程的能力都可抽象为算力。比如人类大脑、手机以及各类服…...

Redis 万字入门教程

0. 前言 文章已经收录到 GitHub 个人博客项目&#xff0c;欢迎 Star&#xff1a; https://github.com/chenyl8848/chenyl8848.github.io或者访问网站&#xff0c;进行在线浏览&#xff1a; https://chenyl8848.github.io/1. NoSQL 1.1 NoSQL 介绍 NoSQL(Not Only SQL )&…...

LeetCode :LCR 173. 点名

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;leetcode刷题 ​ ​ LeetCode :LCR 173. 点名 这个题就是缺失的数字&#xff0c;我们可以通过三种方式来解决这个问题。 1.可以通过位异或的方式来找到这个数&#xff08;相同的数异或为…...

Gin框架操作指南06:POST绑定(下)

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;没用过Gin的读者强烈建议先阅读第一节&#xff1a;Gin操作指南&#xff1a;开山篇。 本节继续演示POST绑定&#xff0c;包括将request-body绑定到不同的结构体中&#x…...

LLaMA、llama.cpp和Ollama区别

LLaMA&#xff1a;LLaMA是由Meta&#xff08;Facebook的母公司&#xff09;开源的大型语言模型&#xff0c;它提供了不同规模的模型&#xff0c;包括1B、3B、11B和90B等参数规模的版本。LLaMA模型支持多语言对话&#xff0c;并在多个基准数据集上进行了评估&#xff0c;展现出与…...

NDK开发

NDK介绍 app为什么会把代码放到so中 a) C语言历史悠久&#xff0c;有很多现成的代码可用 b) C代码执行效率比Java高 c) Java代码很容易被反编译&#xff0c;而且反编译以后的逻辑很清晰 为什么要学习NDK开发 在安卓的so开发中&#xff0c;其他基本与C/C开发一致&#xff…...

docker overlay 占用空间太大,迁移到 /data/

将 Docker 的 overlay 存储驱动迁移到 /data/ 目录下&#xff0c;可以通过以下步骤完成&#xff1a; 1. 停止 Docker 服务 首先&#xff0c;停止 Docker 服务以确保没有容器在运行&#xff0c;并且数据不会被写入到当前的存储位置。 sudo systemctl stop docker2. 备份现有数…...

Windows性能监控与调优:让电脑运行如飞

一、性能监控 1. 使用任务管理器深入监控 打开任务管理器 我们可以通过按下Ctrl Shift Esc快捷键来打开任务管理器。 或者右键点击任务栏空白处&#xff0c;选择“任务管理器”。 查看性能 在任务管理器中&#xff0c;点击“性能”标签页。 我们可以看到“概览”标签&#x…...

前端响应式布局

1.什么是响应式布局&#xff1f; 响应式布局是一种使网页在不同设备&#xff08;如手机、平板和桌面&#xff09;上均能良好显示的设计理念。 2.响应式布局的原理&#xff1f; 通过灵活的网格布局、CSS 媒体查询和弹性单位等技术&#xff0c;实现内容自适应屏幕尺寸变化。 3.响…...

力扣MySQL 1581

先把两张表连接&#xff0c;amount为null 的正是我们需要的&#xff0c;再按customer_id聚合 select Visits.visit_id,customer_id ,Transactions.visit_id ,transaction_id ,amount from Visits left join Transactions on Visits.visit_idTransactions.visit_id 正确代码&…...

就是这个样的粗爆,手搓一个计算器:科学计算器

作为程序员&#xff0c;没有合适的工具&#xff0c;就得手搓一个&#xff0c;PC端&#xff0c;移动端均可适用。废话不多说&#xff0c;直接上代码。 HTML: <div class"calculator"><div class"display-wrapper"><div class"display…...

wordpress使用popup弹窗插件的对比

您在寻找最好的 WordPress 弹出插件吗&#xff1f;大多数网站利用某种形状或形式的弹出窗口来将访问者指向他们希望他们去的地方。例如&#xff0c;这可能用于结帐、电子邮件订阅或用于生成潜在客户。 表现 弹出插件会减慢您的网站速度。当插件使用 WordPress 跟踪弹出窗口的…...

开源OpenStack

1.查询HCS基于OpenStack哪个版本开发 2.九大核心组件 OpenStack可以对接FC也可以对接KVM主机&#xff1b;&#xff08;OpenStack 对接华为FusionCompute&#xff0c;一个集群对应 openstack 一台计算主机&#xff09;-引申出nova compute 2.1nova nova两个核心组件nova contro…...

基于Spring Boot+vue技术的导游系统设计与实现

论文下载【免费】基于SpringBootvue技术的导游系统设计与实现资源-CSDN文库 摘 要 本研究背景主要聚焦于当前旅游业信息化、智能化的发展趋势。随着移动互联网的普及和人们出行方式的多样化&#xff0c;导游系统作为旅游服务的重要组成部分&#xff0c;亟需进行技术革新以提…...

软件测试 —— 灰度测试及测试流程!

软件测试中的灰度测试是一种结合了黑盒测试和白盒测试特点的测试方法&#xff0c;旨在通过逐步扩大测试范围来评估新系统或新功能在真实环境中的性能和稳定性。灰度测试是软件开发过程中的一个重要环节&#xff0c;它有助于在全面发布前发现并修复潜在问题&#xff0c;同时收集…...

中科星图GVE(案例)——AI实现光伏面板提取

目录 简介 函数 gve.Services.AI.solarExtraction(image) 代码 结果 知识星球 机器学习 简介 光伏面板提取是一种将光伏面板从图像或视频中准确地分割出来的任务&#xff0c;可以通过使用深度学习算法来实现。 以下是一种基于深度学习的光伏面板提取的实现步骤&#x…...

一种压缩QRCode矩阵以用于存储的方法

通常QRCode由服务器生成&#xff0c;以图片格式发送到客户端&#xff0c;由客户端直接展示&#xff0c;也可以由客户端使用javascript或其他内置的SDK直接生成。 0、需求 QRCode生成过程中往往是先生成矩阵&#xff0c;然后使用矩阵生成图片&#xff0c;矩阵就是由01组成的一…...

鸿蒙HarmonyOS开发:系统服务

拨打电话 call.makeCall 跳转到拨号界面&#xff0c;并显示待拨出的号码。使用callback异步回调。 makeCall(phoneNumber: string, callback: AsyncCallback<void>): voidimport { call } from kit.TelephonyKit;import { BusinessError } from kit.BasicServicesKit;c…...

【Go】GO语言知识总结浅析

Go语言是一种现代化的编程语言&#xff0c;由Google于2007年设计并于2009年发布。它旨在使编程变得简单、高效&#xff0c;并且可以在多核处理器上轻松构建高性能应用。Go语言的编程思想、发展历史、版本特点、运行原理、数据类型、应用场景&#xff0c;以及在web开发、网络编程…...

GWO-Transformer-LSTM灰狼算法优化深度学习多变量回归预测(Maltab)

GWO-Transformer-LSTM灰狼算法优化深度学习多变量回归预测&#xff08;Maltab&#xff09; 目录 GWO-Transformer-LSTM灰狼算法优化深度学习多变量回归预测&#xff08;Maltab&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现灰狼算法OOA-Transf…...

上市公司企业供应链抵抗力数据集(2012-2023年)

一、测算方式&#xff1a;参考《财经研究》张树山&#xff08;2024&#xff09;老师的做法&#xff0c;供应链抵抗力&#xff08;Resis&#xff09;体现了供应链运行状态的稳定性&#xff0c;即在应对外部扰动时&#xff0c;供应链仍能维持循环畅通。本文从稳固供应链关系来筛选…...

javaWeb项目-ssm+jsp-XX牙科诊所管理系统功能介绍

本项目源码&#xff08;点击下方链接下载&#xff09;&#xff1a;java-ssmjsp私人牙科诊所管理系统实现源码(项目源码-说明文档)资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&…...

tcp_rmem中有三个值4896 131072 6291456是什么意思,有什么作用?

在 TCP 中&#xff0c;tcp_rmem参数的三个值分别具有以下含义和作用&#xff1a; 一、含义 “4896”&#xff1a; 通常代表 TCP 接收缓冲区的最小大小。这是接收端为接收数据预先分配的最小内存空间。当网络中数据量较小时&#xff0c;这个最小缓冲区可以确保有足够的空间来存储…...

转行AI产品经理:高薪诱惑,年薪90万不是梦!

近期有很多社招的小伙伴都在看转行的机会&#xff0c;同时马上要到了秋招的季节&#xff0c;校招生们都在积极选择第一份工作。所有人想要进入一个有前景、高薪高潜力的黄金赛道。 2024年如果大家看新机会&#xff0c;重点给大家推荐AI领域的岗位。先看一组数据&#xff1a; …...

javaWeb项目-ssm+jsp股票交易管理系统功能介绍

本项目源码&#xff08;点击下方链接下载&#xff09;&#xff1a;java-ssmjsp股票交易管理系统实现源码(项目源码-说明文档)资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff…...

CentOS上安装SSL证书教程

在 CentOS 上&#xff0c;apt-get 是不可用的&#xff0c;因为 CentOS 使用的是 yum 或 dnf 包管理器。你可以通过 yum 或 dnf 安装 certbot 和 python3-certbot-nginx。以下是详细的步骤&#xff1a; 1. 启用 EPEL&#xff08;Extra Packages for Enterprise Linux&#xff0…...

单目相机和双目相机定位

1、单目相机 1.1模型 单目相机成像模型为小孔成像&#xff0c;涉及的坐标系包括世界坐标系、相机坐标系、图像坐标系以及像素坐标系。坐标系之间的转换关系如下&#xff1a; 1.2参数求解 张正友相机标定方法、设定世界坐标系精确求解 2、双目相机 2.1、模型 一般双目立体视…...