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

在SpringBoot框架下,接口有读个实现类,在不改变任何源码的情况下,SpringBoot怎么知道给接口注入哪个实现类的依赖呢?

在Spring Boot框架下,当一个接口有多个实现类时,Spring Boot 默认情况下不知道要注入哪个实现类的依赖。因此,你需要使用一些方法来明确告诉Spring Boot应该注入哪个实现类的依赖。

以下是一些常用的方法:

1.使用@Qualifier注解: 你可以在依赖注入点上使用@Qualifier注解来指定要注入的具体实现类的名称。首先,在实现类上使用@Component或@Service等注解进行标记,然后在依赖注入点使用@Qualifier注解来指定要注入的实现类的名称。例如:

@Service
public class MyServiceImpl1 implements MyService {// 实现1的逻辑
}@Service
public class MyServiceImpl2 implements MyService {// 实现2的逻辑
}

在需要注入的地方:

@Autowired
@Qualifier("myServiceImpl1")
private MyService myService;

这样,Spring Boot 将知道要注入MyServiceImpl1实现类的依赖。

2.使用@Primary注解: 你可以在其中一个实现类上使用@Primary注解,以指定一个默认的首选实现类。如果没有使用@Qualifier来明确指定实现类,Spring Boot 将注入使用@Primary注解的实现类的依赖。例如:

@Service
@Primary
public class MyServiceImpl1 implements MyService {// 实现1的逻辑
}
@Service
public class MyServiceImpl2 implements MyService {// 实现2的逻辑
}

在需要注入的地方,不需要额外的注解:

@Autowired
private MyService myService; // 将注入MyServiceImpl1

3.使用条件注解: 你可以使用条件注解(例如@ConditionalOnProperty)来根据应用程序的配置动态选择要注入的实现类

1.使用条件注解(如@ConditionalOnProperty)来根据应用程序的配置动态选择要注入的实现类是一种非常灵活的方法,它允许你根据配置文件中的属性值来决定要使用的实现类。下面是一个示例,演示如何使用@ConditionalOnProperty来实现这一目标。

假设你有一个接口MyService,有两个不同的实现类:MyServiceImpl1和MyServiceImpl2。你想根据配置文件中的属性值来决定要注入哪个实现类。

1.创建接口和实现类:

public interface MyService {void doSomething();
}@Service
public class MyServiceImpl1 implements MyService {@Overridepublic void doSomething() {// 实现1的逻辑}
}@Service
public class MyServiceImpl2 implements MyService {@Overridepublic void doSomething() {// 实现2的逻辑}
}

1.在配置文件(例如application.properties或application.yml)中定义一个属性来指示要使用哪个实现类。例如,将属性名设置为my.service.impl:

my.service.impl=1

1.创建一个配置类,并在该类中使用@ConditionalOnProperty来根据属性值选择要注入的实现类:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyServiceConfig {@Autowiredprivate Environment environment;@Bean@ConditionalOnProperty(name = "my.service.impl", havingValue = "1")public MyService myService1() {return new MyServiceImpl1();}@Bean@ConditionalOnProperty(name = "my.service.impl", havingValue = "2")public MyService myService2() {return new MyServiceImpl2();}
}

在这个配置类中,我们使用了@ConditionalOnProperty注解,并指定了要检查的属性名(my.service.impl)和属性值(1和2)。根据配置文件中的属性值,Spring Boot 将选择注入相应的实现类。

1.在需要使用MyService的地方,通过自动注入来获取具体的实现类:

@Service
public class MyServiceConsumer {private final MyService myService;@Autowiredpublic MyServiceConsumer(MyService myService) {this.myService = myService;}public void useMyService() {myService.doSomething();}
}

在这个示例中,MyServiceConsumer通过自动注入MyService来获取实现类,根据配置中的属性值,将注入MyServiceImpl1或MyServiceImpl2。

相关文章:

在SpringBoot框架下,接口有读个实现类,在不改变任何源码的情况下,SpringBoot怎么知道给接口注入哪个实现类的依赖呢?

在Spring Boot框架下,当一个接口有多个实现类时,Spring Boot 默认情况下不知道要注入哪个实现类的依赖。因此,你需要使用一些方法来明确告诉Spring Boot应该注入哪个实现类的依赖。 以下是一些常用的方法: 1.使用Qualifier注解&a…...

探索数据库管理的利器 - PHPMyAdmin

有一个项目,后端由博主独自负责,最近需要将项目交接给另一位同事。在项目初期,博主直接在数据库中使用工具创建了相关表格,并在完成后利用PhpMyAdmin生成了一份数据字典,供团队使用。然而,在随后的开发过程…...

大数据技术原理与应用学习笔记第1章

黄金组合访问地址:http://dblab.xmu.edu.cn/post/7553/ 1.《大数据技术原理与应用》教材 官网:http://dblab.xmu.edu.cn/post/bigdata/ 2.大数据软件安装和编程实践指南 官网林子雨编著《大数据技术原理与应用》教材配套大数据软件安装和编程实践指…...

算法从未放弃你,放弃你的只有你自己

在人生的旅程中,我们常常会遇到各种挫折和困难。有些人在面对困境时,会选择放弃,将责任归咎于命运或外部环境。然而,算法教给我们一个重要的道理:永远不要放弃 当我们遇到问题或挑战时,算法可以帮助我们找到…...

[Linux 基础] linux基础指令(1)

文章目录 1、Linux下基本指令1.ls指令2.pwd指令3.cd指令4.touch指令5.mkdir指令6.rmdir指令 && rm指令7.man指令8.cp指令9.mv指令10.cat指令11.more指令12.less指令 Linux学习笔记从今天开始不断更新了。第一篇我们从基础指令开始学起。 1、Linux下基本指令 好多人都说…...

ESP32蓝牙主从站模式:主站发送,从站接收,同时附加简单通信协议

主站发送:WXAiBj,六个字符 蓝牙模式是一个字符一个字符发送 主站和从站设置通信协议 使得六个字符一句话完整接收,同时打印出接收完成信息 硬件电路连接如下: 主从站为两个ESP32,只使用了其中的蓝牙功能 代码如下: 主站: //主机模式 #include <Arduino.h> …...

Redis布隆过滤亿级大数据

场景描述 小程序用户的openid作为最主要的业务查询字段&#xff0c;在做了缓存设计之后仍有非常高频的查询&#xff0c;通过埋点简单统计约在每日1000w次。 其中&#xff1a;由于有新增用户原因&#xff0c;导致请求的openid根本不存在MySQL数据库中&#xff0c;这部分统计约占…...

车联网仿真工具Veins学习1

准备条件 假如你是一个小白&#xff0c;先找到相关的参考资料&#xff08;已根据上一篇博客安装好Veins&#xff09;&#xff0c;主要是官方文档和相关的博客&#xff0c;官方提供了一个example&#xff0c;我找到的资料如下&#xff1a; Frequently Asked Questions (FAQ) O…...

封闭岛屿数量 -- 二维矩阵的dfs算法

1254. 统计封闭岛屿的数目 这道题和 岛屿数量 – 二维矩阵的dfs算法 类似&#xff0c;区别在于不算边缘部分的岛屿&#xff0c;那其实很简单&#xff0c;把上⼀题中那些靠边的岛屿排除掉&#xff0c;剩下的就是「封闭岛屿」了。 关于岛屿的相似题目&#xff1a; 岛屿数量 –…...

C语言_指针(1)

文章目录 前言一、指针数组1.1利用指针数组模拟出二维数组 二、数组指针2.1数组名是数组首元素的地址2.2 二维数组传参2.3 一级指针传参2.4 二级指针传参 三. 函数指针四 . typedef 重命名 前言 指针数组是由指针组成的数组。它的每个元素都是一个指针&#xff0c;可以指向任何…...

建站系列(一)--- 网站基本常识

目录 相关系列文章前言一、因特网二、网站三、服务器四、IP五、域名六、DNS七、Hosts文件八、端口号九、URL十、静态网站十一、动态网站 相关系列文章 建站系列&#xff08;一&#xff09;— 网站基本常识 建站系列&#xff08;二&#xff09;— 域名、IP地址、URL、端口详解 …...

Codeforces Round 895 (Div. 3) A ~ F

Dashboard - Codeforces Round 895 (Div. 3) - Codeforces A 问多少次能使a 和 b相等&#xff0c;就是abs(a - b) / 2除c向上取整&#xff0c;也就是abs(a - b)除2c向上取整。 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #de…...

【前端知识】Axios——请求拦截器模板

Axios——请求拦截器模板 Axios是一个基于Promise的HTTP客户端&#xff0c;用于发送HTTP请求。它可以在浏览器和Node.js环境中使用&#xff0c;并且提供了许多强大的功能&#xff0c;例如拦截请求和响应、转换请求和响应数据、取消请求等。 Axios具有简单易用的API&#xff0c;…...

企业架构LNMP学习笔记16

基于IP的访问控制&#xff1a; 基于ngx_http_access_module模块&#xff0c;默认可使用。 语法是&#xff1a; deny ip 禁止IP访问 allow ip 允许IP访问 上面是允许的&#xff0c;下面是deny的。 老师建议写在server段中是比较合适的。 基于用户的访问控制&#xff1a; …...

redis实现消息队列

背景 消息队列&#xff08;Message Queue&#xff09;是一种常见的软件架构模式&#xff0c;用于在分布式系统中传递和处理异步消息。它解耦了发送消息的应用程序和接收消息的应用程序之间的直接依赖关系&#xff0c;使得消息的发送者和接收者可以独立地演化和扩展。 消息队列…...

JVM指令集

概述 JVM&#xff0c;Java Virtual Machine&#xff0c;Java虚拟机器&#xff0c;作为一台独立的机器&#xff0c;一般包括独立的指令集、独立的存储体系以及适合机器自身的运算方式&#xff0c;本章节主要是描述JVM指令的功能与作用。 JVM的每个指令的格式是【指令 操作数1操…...

如何用SSH克隆GitHub项目

诸神缄默不语-个人CSDN博文目录 使用场景&#xff1a;由于不可知的网络问题&#xff0c;无法用HTTPS克隆GitHub项目。 报错fatal: unable to access https://github.com/PolarisRisingWar/llm-throught-ages.git/: GnuTLS recv error (-110): The TLS connection was non-pro…...

sqlx库使用指南

sqlx库使用指南 在项目中我们通常可能会使用database/sql连接MySQL数据库。本文借助使用sqlx实现批量插入数据的例子&#xff0c;介绍了sqlx中可能被你忽视了的sqlx.In和DB.NamedExec方法。 sqlx介绍 在项目中我们通常可能会使用database/sql连接MySQL数据库。sqlx可以认为是Go…...

算法篇汇总

文章浏览 I https://leetcode.cn/problems/article-views-i/description/?envTypestudy-plan-v2&envId30-days-of-pandas&langpythondata 我的题解&#xff1a; import pandas as pddef article_views(views: pd.DataFrame) -> pd.DataFrame:dfviews[views[auth…...

typeScript 学习笔记(二)

类接口 TypeScript 入门教程 (xcatliu.com) 十四.类 ① 类 类&#xff1a;定义了一件事物的抽象特点&#xff0c;包含它的属性和方法对象&#xff1a;类的实例&#xff0c;通过new生成面向对象&#xff08;OOP&#xff09;的三大特性&#xff1a;封装、继承、多态封装&…...

redis集群架构详解

一、集群架构搭建 1、配置 在一台机器上模拟多台机器搭建redis集群&#xff0c;一个集群代表一台物理机 集群1路径&#xff1a; /usr/local/redis/redis-cluster/cluster1/9001/redis.conf/usr/local/redis/redis-cluster/cluster1/9004/redis.conf/usr/local/redis/redis-…...

nodejs设置镜像

1、npm镜像地址配置 -- 查看 npm 安装目录 npm root -g-- 查看 npm 配置信息 npm config list-- 查询当前镜像配置 npm get registry-- 或者仅修改 npm 命令镜像 -- 设置为淘宝镜像 npm config set registry https://registry.npmmirror.com -- 修改为官方镜像 npm config set…...

CSS中如何在table中隐藏表格中从第4个开始的多个 <tr> 元素

隐藏指定行 使用 CSS 的 nth-child 选择器来选择表格中的特定行&#xff0c;并隐藏它们。 以下是一个示例 CSS 规则&#xff0c;用于隐藏表格中的第 4 个和第 5 个行&#xff08;索引从 1 开始&#xff09;&#xff1a; table tr:nth-child(4), table tr:nth-child(5) {displ…...

【类和对象】③友元类

文章目录 1.初始化列表2.static静态成员3.友元 1.初始化列表 我们知道在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。虽然调用构造函数之后&#xff0c;对象中已经有了一个初始值&#xff0c;但是不能将其称为对对象中成…...

算法通关村第十六关:黄金挑战:滑动窗口与堆结合

黄金挑战&#xff1a;滑动窗口与堆结合 堆的大小一般是有限的&#xff0c;能直接返回当前位置下的最大值或者最小值 该特征与滑动窗口结合&#xff0c;可以解决一些特定场景的问题 1. 滑动窗口与堆问题的结合 LeetCode239 https://leetcode.cn/problems/sliding-window-maxi…...

6.2.2 【MySQL】InnoDB中的索引方案

上边之所以称为一个简易的索引方案&#xff0c;是因为我们为了在根据主键值进行查找时使用二分法快速定位具体的目录项而假设所有目录项都可以在物理存储器上连续存储&#xff0c;但是这样做有几个问题&#xff1a; InnoDB 是使用页来作为管理存储空间的基本单位&#xff0c;也…...

划片机实现装片、对准、切割、清洗到卸片的自动化操作

划片机是一种用于切割和分离材料的设备&#xff0c;通常用于光学和医疗、IC、QFN、DFN、半导体集成电路、GPP/LED氮化镓等芯片分立器件、LED封装、光通讯器件、声表器件、MEMS等行业。划片机可以实现从装片、对准、切割、清洗到卸片的自动化操作。 以下是划片机实现这些操作的步…...

OpenCV(二十五):边缘检测(一)

目录 1.边缘检测原理 2.Sobel算子边缘检测 3.Scharr算子边缘检测 4.两种算子的生成getDerivKernels() 1.边缘检测原理 其原理是基于图像中灰度值的变化来捕捉图像中的边界和轮廓。梯度则表示了图像中像素强度变化的强弱和方向。 所以沿梯度方向找到有最大梯度值的像素&…...

上行取消指示 DCI format 2_4

上篇介绍了DCI format 2_1的DL传输中断的内容&#xff0c;这篇就看下DCI format 2_4有关的UL 传输取消机制&#xff0c;值得注意的是这里的UL传输针对的是PUSCH和SRS传输。 UL cancellation DCI format 2_4相关机制引入的背景与DCI format 2_1一样&#xff0c;都是因为URLLC和e…...

百望云蝉联2023「Cloud 100 China 」榜单 综合实力再获认可

9月7日&#xff0c;2023 Cloud 100 China 榜单于上海中心正式发布&#xff0c;榜单由靖亚资本与崔牛会联合推出&#xff0c;百望云凭借着过硬的综合实力与卓越的技术创新能力&#xff0c;再次荣登榜单&#xff0c;位居第六位。 本届评选&#xff0c;Top 100 企业的数据指标的权…...

wordpress 当前分类名称/百度推广排名怎么做的

SPKT/DSM接口介绍 给卫星接收无关&#xff0c;是一个叫做JR的遥控器公司给自己遥控器取得名字叫做卫星接收&#xff0c;其实和普通遥控器的差别主要在于信号调制方式不一样。...

什么网站可以做私房菜外卖/网络优化的工作内容

目录 简略说明 详细说明 Yum apt-get dnf Homebrew 区别 YUM和DNF的区别 Yum和apt-get的区别 Yum和rpm的区别 常用命令 yum/dnf 常用命令 rpm命令 linux命令好玩的命令 简略说明 apt-get 是德班系&#xff08;Debian、Ubuntu等&#xff09;的软件管理命令 yum 是红帽系&#xf…...

让别人做网站应注意什么/营销策略都有哪些

7:30−9:307:30 - 9:307:30−9:30 哭了哭了 &#xff0c; T1T1T1真的给我写崩了QWQ 。 我的思路是这样的 &#xff1a; 根据数据范围 &#xff1a; 4<k<84 < k < 84<k<8 &#xff0c; k4k 4k4这一组数据 &#xff0c; 跑个状压就可以轻松拿到 &#xff0c; …...

网站推广方法有/seo自然排名优化

为什么80%的码农都做不了架构师&#xff1f;>>> 如今&#xff0c;软件通常会作为一种服务来交付&#xff0c;它们被称为网络应用程序&#xff0c;或“软件即服务”&#xff08;SaaS&#xff09;。 “十二要素应用程序”&#xff08;12-Factor App&#xff09;为构建…...

wordpress 评论表情插件/aso应用优化

前言 本章内容是android.os.HandlerThread&#xff0c;版本为Android 3.1 r1&#xff0c;翻译来自"雪鹰工作室"&#xff0c;再次感谢"雪鹰工作室"&#xff01;欢迎你一起参与Android的中文翻译&#xff0c;联系我over140gmail.com。 声明 欢迎转载&#x…...

哪个网站可以免费做网页/活动推广朋友圈文案

Android里的C代码经常会看到AutoMutex _l(mLock); AutoMutex其实就是Thread的一种自动的互斥锁&#xff0c;定义在framework/base/include/utils/thread.h中&#xff1b; /* * Automatic mutex. Declare one of these at the top of a function. * When the function return…...