如何优雅的处理SpringBoot中的多个实现类

基于SpringBoot的策略模式多实现类注入(Map注入) 1前言 在业务处理的过程中遇见一个场景,设备分A,B,C,他们都是对应的实现都是正删改查,但是不同的设备对应的增删改查业务逻辑有存在差异,这个时候如果不想办法设计代码就会出现A,B,C三个设备都要写一个对应接口(XXXserver),然后分别再去实现他们(XXXserverImpl),如果后来再增加一台设备D,我们又要去重复相关接口和实现,不仅显得代码冗余,更是不好维护和管理,所以利用设计模式---策略模式就解决了这个问题。 2基础知识 2.1对@Autowired注解的理解 在平常使用中我们对@A 阅读详情

常规做法

@ConditionalOnProperty(name = "service.choice", havingValue = "service1")

我们都知道注解@ConditionalOnProperty可以进行配置选择注入,那如果多个实现想要并存如何实现呢,往下看:

多实现并存

接口

public interface MyService {
    String get();
}

实现一

@Service
public class MyServiceImpl1 implements MyService {
    @Override
    public String get() {
        return "Impl_1";
    }
}

实现二

@Service
public class MyServiceImpl2 implements MyService {
    @Override
    public String get() {
        return "Impl_2";
    }
}

Service选择

这个类主要是为了对多个实现类进行合理的选择(注意:这里存在bean依赖问题。通常来说解决bean依赖问题有两种方式:1.构造器依赖,2.DependsOn注解)

@Service
//@DependsOn({"myServiceImpl1", "myServiceImpl1"})
public class ServiceSwitch {
    private final Map<String, MyService> services = new HashMap<>();

    public ServiceSwitch(Map<String, MyService> map) {
        map.forEach((k, v) -> services.put(k, v));
    }

    /**
     * 根据名字返回相应的实现类
     *
     * @param type 类名
     * @return 实现类
     */
    public MyService get(String type) {
        return services.get(type);
    }
}

Api测试

public class ConfigApi {
    @Autowired
    private ServiceSwitch switch;

    @GetMapping("/service/{s}")
    public String getService(@PathVariable("s") String s) {
        final MyService myService = switch.get(s);
        return myService.get();
    }
}

测试

访问:http://localhost:8080/config/service/myServiceImpl1,返回:Impl_1

访问:http://localhost:8080/config/service/myServiceImpl2,返回:Impl_2

SpringBoot 实现优雅停机处理 是指在服务器需要关闭或重启时,能够先处理完当前正在进行的请求,然后再停止服务的操作。 阅读详情

相关推荐

ST-Link V2的隐藏技能:多通道串口调试的终极指南

本文深入探讨了ST-Link V2的多通道串口调试功能,突破传统烧录工具的限制。通过详细的硬件配置、Arduino IDE设置和实战案例,展示了如何利用SWD接口实现多通道数据监控,提升STM32F103C8T6等开发板的调试效率。文章还提供了PCB布局优化和性能调优技巧,助力开发者充分发挥ST-Link V2的潜能。

weixin_29285605的博客 357

springboot中一个service接口多个实现类,如何注入

一般来说我们的service接口都是只有一个实现类而已,但有些时候,确实会有两个实现类的情况,那这个时候我们怎么自动注入这个接口呢? 1、首先,有一个接口PersonService,然后再写两个实现类PersonServiceImp1、PersonServiceImp2 2、进行测试 如果我们直接注入接口的话,idea就会给我们报错 3、解决办法 其实自动注入时,它首先会先根据class类型来找到相应的实现类,如果这里有两个相同类型的实现类时,那我们可以通过实现类的id来找,比如说PersonS

AntKengElephant的博客 1万+

从零到一:ArduPilot无人船PID调参实战指南

本文详细介绍了ArduPilot无人船PID调参的实战指南,从基础参数设定到高级调参技术,帮助用户掌握水面环境下的PID控制逻辑。通过案例分析和参数示例,解决无人船在空载、负载变化及不同水域环境中的航行问题,提升无人船的稳定性和精确度。

weixin_29266647的博客 507

Spring 多个Conditional -> Bean创建

@Bean @ConditionalOnBean(DataSource.class) // 1 @ConditionalOnProperty("xxx") //2 public String hello(){ System.out.println("&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&amp

wuhulala的休息室 2081

cadence数模混合仿真反标sdf

数模混合IC设计时经常要调用一些Verilog模块(最简单的例如SPI接口),在前仿时一般直接用rtl代码来仿真,但是后仿时要关注因寄生带来的延迟,避免这些额外的延迟导致时序错误,因此不能简单地采用RTL来仿真。 一般有两种办法:1是采用由RTL综合得到的门级电路来仿真,这种方法比较简单,但是缺点是规模较大,而且只包括门延迟不包括因版图导致的线延迟;如果想要仿真更精细,就要对该这部分门电路提取寄生参数; 另一种方式是利用sdf文件(standard delay format)来进行仿真。后端工具在布局布

长河柱天的博客 7274

LTO编译器优化介绍以及开启方法

LTO优化的详细介绍

性感的小君君 4924

[SpringBoot]接口的多实现:选择性注入SpringBoot接口的实现类

SpringBoot的Service是否可以有多个实现类呢?该如何确定我要注入的那一个实现类呢?

Jim.kk的笔记 3237

把入库交货单的 GOS 附件自动带进审批 Work Item:用 SOFM 对象打通 SAP Workflow 附件链路

本文介绍了一种在SAP ECC系统中将入库交货单的GOS附件自动附加到Workflow审批项中的解决方案。通过使用BOR对象引用列表和SOFM业务对象,审批人可直接在Work Item中查看附件,无需返回原单据界面。文章详细阐述了从BUS2015业务对象获取附件连接、转换LOIO_ID为SOFM对象引用,并将附件列表绑定到User Decision步骤的具体实现方法。该方案适用于经典SAP Business Workflow+BOR架构,核心ABAP代码可直接复用,有效解决了审批流程中的附件可见性问题。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 246

Spring中,Service有多个实现类时准确注入方式

Spring中Service有多个实现类时准确注入方式 以及@Resource和@Autowired的区别

xiaochen的博客 3566

DeepSeek网页版和DeepSeek Harness

DeepSeek网页版是开箱即用的对话工具,适合快速问答与日常任务;而DeepSeekHarness(dsh)是基于Node.js的开源智能体框架,支持文件操作、命令执行、多工具协同,实现“对话即执行”。二者定位不同:网页版为“大脑”,Harness为“躯体”。前者封闭易用,后者开放可扩展,具备可追溯的执行日志与插件化架构。未来,网页版将聚焦轻量化普及,Harness则致力于构建生态平台。对开发者而言,应将AI作为执行层,守住决策层,深耕垂直领域,并掌握AI工作流设计能力,以构建不可替代的技术优势。

几十年资深高级架构师,技术专家的技术笔记。专注C、Java、Python、微服务、云原生、AI工程化及高并发系统分布式架构实战,分享源码剖析、性能调优与架构治理经验。 912

【异常】OpenClaw LLM请求超时异常LLM request timed out.的技术分析与解决方案

LLM请求超时是OpenClaw工程化落地中最常见的链路稳定性问题,排查处置需遵循标准化的分级流程。绝大多数场景可通过重试、调整超时配置、优化模型选型快速解决;针对顽固型异常,可通过全链路日志拆解超时阶段,精准定位根因并完成针对性修复,最终保障OpenClaw业务链路的稳定运行。

奶爸的编程之路,也就一周冷个三天 1988

springboot基于注解方式实现策略模式

基于注解实现策略模式 在项目开发的过程中,我们经常会遇到很多的业务分支,一般我们都采用switch或者if else简单粗暴来处理,当每次我们需要新增一个分支业务逻辑时,就需要修改整体业务逻辑。 因此在项目中,可以采用策略模式进行优化 例如: 使用策略模式发送不同的信息 ##定义策略分类 ...

aogula的博客 1612

025、空间降噪与时域降噪:噪声抑制与细节保留的平衡艺术

《降噪技术的平衡艺术:空间与时域降噪的协同优化》 本文深入探讨了图像处理中空间降噪与时域降噪的技术原理与工程实践。空间降噪通过像素级处理提升单帧质量,而时域降噪则利用帧间信息增强稳定性。文章揭示了两种方法在实际应用中的矛盾点:过度降噪会导致细节损失,影响后续算法性能。作者结合车载环视系统等实战案例,详细分享了参数调优经验,包括运动自适应策略、边缘保持技巧和嵌入式平台优化方案。特别强调降噪的最终目标应服务于下游算法需求,而非单纯追求图像美观。文章为工程人员提供了从理论到实践的完整指导,展现了降噪技术在效果与性

sundong_81的博客 186

使用Springboot实现策略模式,减少if else语句

利用springboot快速实现策略模式

weixin_45996984的博客 598

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Springboot中如何优雅的写好Controller层代码

优雅?看到这个词,我第一反应是什么是优雅?怎么写才算优雅?一千个读者有一千个哈姆雷特,每个人的经验、阅历不同,也许理解就不同。我对优雅的理解很简单,就是简洁有效、容易理解,别那么多套路。java中使用Sping的web项目通常会分为三层,分别是controller、service、dao,这似乎已成为了一个既定规则。很少有人去想为什么要这样分?可不可不以不这样分?java属于面向对象的高级编程语言,其实这种分法并不符合面向对象的理念,而实际这是按照一次B-S请求过程从外到内的调用过程划分的,然后根据面向接口

凡夫编程 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

SpringBoot 优雅实现接口的多实现类方式

java/*** 支付方式类型枚举* 定义系统支持的支付渠道*/@Getter/*** 支付宝支付*/ALIPAY("alipay", "支付宝"),/*** 微信支付*/WECHAT("wechat", "微信"),/*** 银联支付*/UNIONPAY("unionpay", "银联");/*** 支付类型编码*//*** 支付类型描述*/

2501_93078354的博客 953

SpringBoot 优雅的处理异常

SpringBoot 统一异常处理 像这种统一异常的文章博客有许多,但是每个人使用都有自己的心得,我来总结一下自己使用的心得 统一异常,顾名思义,就是统一管理项目中会方法的异常,然后进行一个处理,Spring发生错误后,底层会去请求一个/error的地址,抛出对应的异常到页面上,对客户或者开发来说都不是特别的友好 使用统一异常处理的话,可以返回自定义的异常数据,阅读性提高,优雅的处理异常 使用异常...

如漩涡的博客 1611

SpringBoot停止服务的几种优雅姿态

在使用Spring Boot的时候,都要涉及到服务的停止和启动,当我们停止服务的时候,很多时候大家都是kill -9 直接把程序进程杀掉,这样程序不会执行优雅的关闭。而且一些没有执行完的程序就会直接退出。 我们很多时候都需要安全的将服务停止,也就是把没有处理完的工作继续处理完成。比如停止一些依赖的服务,输出一些日志,发一些信号给其他的应用系统,这个在保证系统的高可用是非常有必要的。那么咱们就来看一下几种停止SpringBoot的方法。 第一种就是 SpringBoot 提供的actuator的功...

Janson_Lin 4084

如何在SpringBoot中实现优雅关闭

Shutdown、Crash 和 Graceful 之间的区别在于,它控制决定了我们可以用这个事件做什么。按照我们的期望,Spring Boot应该为我们提供一种处理此事件的方法,这样我们就可以确保良好的资源管理(清理资源、释放锁和连接)。让我们看看 Spring Boot 提供什么。

码到三十五 1万+

【SpringBoot】SpringBoot优雅停机机制

拒绝新请求:关闭过程开始后,系统不再接收新的用户请求。完成当前请求:对已接收的请求完成处理,避免突然中断。资源清理:在停机前,释放各种资源(数据库连接、线程池等),保证系统的状态完整性。优雅停机的核心是提供一种“无感知”的下线体验,让用户和系统都能安全退出。如果需要在停机时执行特定的清理操作,比如关闭数据库连接或停止线程池,可以通过添加或实现接口。@Component@OverrideSystem.out.println("关闭数据库连接...");

学不会就接着学 2859

SpringBoot中如何优雅地管理多个策略实现类?Map注入实战指南

本文详细介绍了在SpringBoot中如何利用Map注入优雅管理多个策略实现类,结合策略模式实现灵活的业务逻辑扩展。通过实战示例展示基础实现和高级技巧,包括自定义Map key、条件化策略注册等,帮助开发者构建可维护的代码架构。

weixin_33724046的博客 208

面试官:SpringBoot如何优雅停机?

本文内容已收录至我的面试网站:www.javacn.site优雅停机(Graceful Shutdown)是指在服务器需要关闭或重启时,能够先处理完当前正在进行的请求,然后再停止服务的操作。优雅停机的实现步骤主要分为以下几步:停止接收新的请求:首先,系统会停止接受新的请求,这样就不会有新的任务被添加到任务队列中。处理当前请求:系统会继续处理当前已经在处理中的请求,确保这些请求能够正常完成。这通常涉...

磊哥聊Java 2012

SpringBoot 实战:如何优雅的处理异常

前段时间写了一篇关于实现统一响应信息的博文,根据文中实战操作,能够解决正常响应的一致性,但想要实现优雅响应,还需要优雅的处理异常响应,所以有了这篇内容。 作为后台服务,能够正确的处理程序抛出的异常,并返回友好的异常信息是非常重要的,毕竟我们大部分代码都是为了 处理异常情况。而且,统一的异常响应,有助于客户端理解服务端响应,并作出正确处理,而且能够提升接口的服务质量。 SpringBoot提供了异常的响应,可以通过/error请求查看效果: 这是从浏览器打开的场景,也就是请求头不包括content-ty.

沉潜飞动 2995

SpringBoot 如何优雅的进行全局异常处理

设计一个有效的全局异常处理器需要考虑多个方面,包括但不限于异常的分类、日志记录以及对不同客户端的响应。首先,我们需要创建一个类并使用注解将其标记为全局异常处理器。接着,利用注解指定要处理的异常类型。

master_chenchen的博客 5440

SpringBoot项目里,如何用CompletableFuture优雅处理多个第三方API调用?

本文详细介绍了在SpringBoot项目中如何利用Java8的CompletableFuture优雅处理多个第三方API调用,实现异步非阻塞编程。通过基础用法、高级组合操作及性能优化实践,帮助开发者提升微服务架构下的API调用效率,显著降低响应时间并优化资源利用率。

weixin_30835649的博客 640
上一篇: Sonar8.3.1降级到7.8
下一篇: Spring事物的传播策略
Mr.ChowSit
博客等级 码龄11年 30粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值