动态切换实现类框架,快看看 Spring-Smart-DI 是不是你的菜?

Spring-Smart-DI:3步搞定动态切换实现类,你还在手动写if-else吗? 从Spring-Smart-DI的表现来看,它完全有潜力成为动态切换领域的标杆。相比传统方案,它不仅性能更强,而且部署更简单、成本更低。不过话说回来,Spring-Smart-DI的成功不只是技术上的胜利,更是开源精神的胜利。像burukeyou这样的开发者能把这么核心的技术开源出来,说明他们真的想推动行业进步。你有没有用过Spring-Smart-DI?或者你对动态切换有什么独特的见解?欢迎在评论区分享你的实战经验。说不定你的一个小技巧,就能帮其他开发者少走十年弯路! 阅读详情

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

6d271c0d4bd151ac0d2bc25c8039b424.gif

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、CRM 等等功能:

  • Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本 

来源:juejin.cn/post/
7342279484487270450

86708967eae2b8a58a4c3332abdd353a.png


0、背景

一般我们系统同一个功能可能会对接多个服务商,防止某个服务商的服务不可用快速切换或者收费不同需要切换,那我们一般做快速切换逻辑传统无非就是先将每个服务商实现,然后在配置点(数据库或者nacos)配置当前正在使用的服务商。然后每次执行的时候从配置点获取当前正在使用的服务商,然后去执行该服务商的业务逻辑。

比如系统接入了多个短信服务商,然后用户可以动态的切换不同的服务商,

如果让我们手写会如何实现。

  • 第一步先在某个位置(不管是nacos还是数据库)配置当前使用的服务商的对应值比如 sms.impl = "某腾短信"

  • 第二步,在代码里执行发短信的时候,手动获取该sms.impl对应的服务商的实现类,伪代码可能如下

void sendSmsTouser(Req req){
  // 1、获取当前使用的服务商
  String name = get("sms.impl");
 // 2、获取对应的实现类
  SmsService smsService = springContext.getBean(name);
 // 3、使用smsService执行具体业务逻辑
 smsService.sendMsg(req)
}

这时有一个想法就是 spring的@Autowired注解在注入的时候可以自动根据在配置点配置的实现类去注入,并且当配置变了,注入的实现类也会改变,这样就跟正常写代码一样不再需要去关注当前使用的实现类。这时spring-smart-di 的 AutowiredProxySPI 应运而生。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

1、spring-smart-di

它是一个对spring @Autowired注解的扩展,能够自定义用户自己的Autowired注入逻辑,目前实现了两个功能分别是 @SmartAutowired 和 @AutowiredProxySPI 注解,我们这里要使用的便是AutowiredProxySPI 去实现我们的动态切换逻辑。

假设对接了多个短信服务商,下面以一个快速开始案例去看看如何使用 AutowiredProxySPI 如何实现动态切换

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

2、快速开始

引入依赖

<dependency>
    <groupId>io.github.burukeyou</groupId>
    <artifactId>spring-smart-di-all</artifactId>
    <version>0.2.0</version>
</dependency>

然后在Spring配置类上标记 @EnableSmartDI 注解 启用功能

2.1  @EnvironmentProxySPI注解

@EnvironmentProxySPI代表的是一个配置点,用来配置怎么获取具体实现类的逻辑。

假设系统短信服务商存在以下两个服务商,我们需要做动态切换。需要在接口上配置@EnvironmentProxySPI表示从环境变量配置点中获取当前使用的服务商。这里配置到属性 ${sms.impl} 里

@EnvironmentProxySPI("${sms.impl}")
public interface SmsService {
}

// 给实现类定义别名
@BeanAliasName("某腾短信服务")
@Component
public class ASmsService implements SmsService {
}

@BeanAliasName("某移短信服务")
@Component
public class BSmsService implements SmsService {
}

2.2 配置当前使用的服务商

比如在配置文件中配置。这里的值可以是@BeanAliasName的值,也可以是@Component的值,也可以具体的是全路径类名。

sms:
  impl: 某移短信服务

2.3 @AutowiredProxySPI注入使用

然后我们只需要像使用@Autowired注解一样去使用 @AutowiredProxySPI注解即可。

// 依赖注入
@AutowiredProxySPI
private SmsService smsService;

这样我们就完成了一个动态切换需求,只要我们改变配置配置属性${sms.impl}的值就会实时生效而无需重启服务,因为他注入的是一个代理对象每次执行时会先去实时获取当前使用的实现类然后才去执行调用, 并且在使用上与原先直接使用@Autowired基本毫无区别

2.4 定义不同的配置点

@EnvironmentProxySPI是用来配置环境变量相关的配置点,如果想要自定义配置比如在数据库中可实现自己的ProxySPI注解。

比如自定义DBProxySPI注解,并标记上@ProxySPI实现并指定具体配置获取逻辑实现类AnnotationProxyFactory即可。

然后DBProxySPI就可以像@EnvironmentProxySPI一样去使用了,下面是实现的伪代码

@Inherited
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@ProxySPI(DbProxyFactory.class) // 指定配置获取逻辑
public @interface DBProxySPI {
    
    String value();

}

@Component
public class DbProxyFactory implements AnnotationProxyFactory<DBProxySPI> {

    @Autowired
    private SysConfigMapper sysConfigDao;
    
    @Override
    public Object getProxy(Class<?> targetClass,DBProxySPI spi) {
        // todo 根据注解从数据库获取要注入的实现类
        String configName = sysConfigDao.getConfig(spi.value());
        return springContext.getBean(configName);
    }
}


@DBProxySPI("${sms.impl}")
public interface SmsService {
}

其他

GitHub项目地址

https://github.com/burukeYou/spring-smart-di

Maven仓库地址

https://central.sonatype.com/artifact/io.github.burukeyou/spring-smart-di-all

还在迭代中,第一个版本主要专注于动态切换, 还需要什么好玩的功能和特征请留下你的意见感谢。觉得有用或者能学到点什么可以star下哈哈。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,“长按”或“扫描”下方二维码噢:

37ae2fc71f8235a3bdbf66dca5620196.png

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

194f3a17f89c5b5a48e1e1222077e556.png

515ef7dd1af01bd5d4bd100d9b78b669.png7b70b6b376a43e85a015837e1df49c3c.pngc19362e867cf0ddd640e9b89d0356543.png2c30c1414e6db6e408306c2ae1ba0bd2.png

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
Spring-Smart-DI 动态切换实现类,很不错! 凌晨一点多我们组在 debug,一个支付接口的实现逻辑,突然发现需要动态切换实现类。因为我们不同商户走的支付通道不一样,有的要支付宝,有的要微信,有的甚至是走境外的通道。结果发现以前写死在 Spring 配置里的实现类,根本没法动态换,这就尴尬了。后来我就想起之前玩过的一个小技巧 —— Spring-Smart-DI,用来做动态切换实现类,特别顺手。 阅读详情

相关推荐

5步玩转Spring-Smart-DI,动态切换实现类不再是难题?

Spring-Smart-DI 是一个对Spring@Autowired注解的扩展,能够自定义用户的Autowired注入逻辑。:智能注入,根据条件自动选择合适的实现类。:动态代理注入,根据配置点实时切换实现类。假设我们有一个短信发送接口SmsService,并且有两个实现类和。@Component@BeanAliasName("某腾短信服务")@OverrideSystem.out.println("使用某腾短信服务发送消息: " + message);@Component。

java专栏 2089

spring-smart-di 动态切换接口源

一般我们系统同一个功能可能会对接多个服务商,防止某个服务商的服务不可用快速切换或者收费不同需要切换,spring-smart-di 的 AutowiredProxySPI可帮助我们快速实现不同接口源的

BurukeYou 1100

基于Arduino与光电传感器的心率监测系统:从原理到实现的完整指南

光电式心率监测是一种基于光电容积脉搏波描记法(PPG)的非侵入式生命体征测量技术。其核心原理是利用特定波长光线照射皮肤组织,通过检测因血液容积周期性变化导致的反射光强微弱波动,来获取心率信息。这项技术的关键价值在于实现了低成本、便携化的连续生理参数监测,广泛应用于健康管理、运动科学及嵌入式系统教学领域。在工程实践中,信号处理算法(如移动平均滤波与动态阈值峰值检测)对提升测量精度至关重要。本文以Arduino平台为例,详细解析了如何集成MAX30102或Pulse Sensor Amped等光电传感器,结合T

weixin_33461476的博客 246

Spring:DI思想的详细图解

DI 就是依赖注入,,简单来讲,其实就是,把 IoC 容器中的 bean 对象取出来直接放到某个类的属性中,不再需要我们自己手的的new对象。例如下面代码,

Shine0115的博客 1487

URScript介绍

优傲机器人(Universal Robots)是丹麦工业协作机器人制造商,2005年成立,2015年被泰瑞达收购。其自研编程语言URScript基于Python语法,专为机器人控制优化,支持运动指令、IO控制等功能,具有类Python的简洁语法和实时性特点。URScript提供丰富的API,支持变量赋值、条件判断、循环及函数定义等编程结构,参数按值传递。用户可通过该语言在Polyscope界面编写程序,实现自动化任务。目前优傲在全球20多个办事处为多国客户提供服务。

谢谢大家的关注和点赞!这里只有纯纯的知识干货,没有一句废话。希望能实实在在帮到大家~要是觉得有用,别忘了给我点支持哟,你 603

深度学习(Deep Learning, DL)简介

深度学习(Deep Learning, DL)是机器学习的一个子领域,主要使用多层神经网络来处理复杂的数据和任务。深度学习通过模拟人脑的神经网络结构,能够自动提取特征并进行高效的模式识别和预测。

qq_28791753的博客 1万+

Spring-Smart-DI 牛逼!动态切换实现类框架

因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享点击关注#互联网架构师公众号,领取架构师全套资料 都在这里0、2T架构师学习资料干货分上一篇:2T架构师学习资料干货分享大家好,我是互联网架构师!0、背景一般我们系统同一个功能可能会对接多个服务商,防止某个服务商的服务不可用快速切换或者收费不同需要切换,那我们一般做快速切换逻辑传统无非就是先将每个服务商实现,然后在配置点(数据库...

emprere的博客 157

用Arduino和8个舵机,从零搭建一台能走路的并联腿机器狗(附完整代码与3D模型)

本文详细介绍了如何用Arduino和8个舵机从零搭建一台能走路的并联腿机器狗,包括硬件准备、结构组装、电路系统搭建、运动算法实现和Arduino编程。通过完整的代码与3D模型,帮助创客深入理解机器人运动原理,实现稳健行走的8自由度机器狗。

weixin_30482383的博客 702

动态切换实现类框架,快看看Spring-Smart-DI 是不是你的菜?

往期热门文章: 1、淘宝网搞个VsCode、Excel 主题是几个意思,上班摸鱼刷淘宝? 2、再见ExecutorService,你好StructuredTaskScope 3、我司使用了两年的高效日志打印工具,非常牛逼! 4、这个Spring Boot脚手架绝了!太好用了! 5、千万级数据的全表update的正确姿势0、背景一般我们系统同一个功能可能会对接多个服务商,防止某个服务商的服务不可用...

Java后端技术 195

TPRI-DMP平台介绍

TPRI-DMP为华能集团西安热工院自主产权的工业云PaaS平台,已经过13年的发展和迭代,其具备大规模能源电力行业生产应用软件开发和运行能力

ashou706的专栏 2277

【MFiX后处理】MFiX中使用des_usr_var输出颗粒的传热量(2020-11-27更新变更输出变量名方法)

参考之前Yin的那一篇博客 https://www.cnblogs.com/Jay-CFD/p/10621274.html 输出一下颗粒传热量 使用的算例是fluid_bed_dem_2d 打开des scalar tracking 前面都和Yin那篇一样,打开enable user scalar tracking 输入2 因为第一个用来测试Y加速度了 第二个输出传热量 然后在output vtk中勾选好 更改源代码 源代码为des_thermo_newvalues.f 在mfix-GUI自带的ed

beidou111的博客 1533

Spring-Smart-DI 动态切换实现类

传统的快速切换逻辑实现方法是,先为每个服务商编写对应的实现类,然后在配置点(这个配置点可以是数据库,也可以是像 Nacos 这样的配置中心)配置当前正在使用的服务商。其一,为了规避某个服务商的服务出现不可用的风险,以便在出现问题时能够迅速切换到其他服务商,确保系统的稳定性和业务的连续性;注解在注入时能够自动根据配置点的配置去注入对应的实现类,并且当配置发生变化时,注入的实现类也能自动更新呢?通过以上的步骤,我们就可以灵活地实现动态切换服务提供商的功能,并且可以根据不同的需求自定义配置获取逻辑。

qq_43380361的博客 620

QCC304x系列开发教程(实战篇)之5.2 QCC3040之提示音

earbud_init.c中,初始化table中UiPrompts_Init /*! \brief Table of initialisation functions */ static const init_table_entry_t appInitTable[] = { ......... {UiPrompts_Init, 0, NULL}, ......... } ui_prompts.c中是提示音音处理的主要逻辑和配置源文件 函数static void uiPro...

心跳包的博客 2395

Spring-Smart-DI 动态切换实现类,很不错

是对 Spring@Autowired注解的一次创新性扩展,它为用户提供了自定义Autowired注入逻辑的能力。和。在本文中,我们将重点聚焦于如何使用来实现动态切换服务提供商的功能。假设我们的系统对接了多个短信服务商,下面我们通过一个快速上手的案例,详细了解如何使用来实现动态切换。注解主要用于配置环境变量相关的配置点。如果我们想要自定义配置,例如从数据库中获取配置信息,可以实现自己的ProxySPI注解。下面是一个自定义DBProxySPI注解的示例,我们需要标记上@ProxySPI。

tangjieqing的博客 676

电阻抗成像肺功能测试数据分析与直方图生成

本文介绍了基于MATLAB的电阻抗成像(EIT)肺功能测试数据分析方法。研究针对32×32像素的EIT图像序列,通过三步算法处理:首先计算特定时间点与谷值图像的差值,然后分析1秒后峰值与1秒值的差值,最终计算比值矩阵并处理异常值。系统展示了数据预处理、关键时间点检测、比值计算及统计分析的全流程,包括生成概率分布直方图和空间分布图等可视化方法。该分析为无创肺功能评估提供量化指标,可应用于临床呼吸监测和疾病诊断。

huanghm88的专栏 197

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Spring-Smart-DI !动态切换实现类框架

​​​是用来配置环境变量相关的配置点,如果想要自定义配置比如在数据库中可实现自己的​​ProxySPI​​注解。比如自定义​​​注解,并标记上​​​实现并指定具体配置获取逻辑实现类​​即可。然后​​​就可以像​​一样去使用了,下面是实现的伪代码@Inherited@ProxySPI(DbProxyFactory.class) // 指定配置获取逻辑@Component@Autowired@Override// todo 根据注解从数据库获取要注入的实现类。

kangbin825的专栏 624

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

动态切换实现类框架,快看看 Spring-Smart-DI !

是用来配置环境变量相关的配置点,如果想要自定义配置比如在数据库中可实现自己的ProxySPI注解。比如自定义DBProxySPI注解,并标记上@ProxySPI实现并指定具体配置获取逻辑实现类即可。然后DBProxySPI就可以像一样去使用了,下面是实现的伪代码@Inherited@ProxySPI(DbProxyFactory.class) // 指定配置获取逻辑@Component@Autowired@Override// todo 根据注解从数据库获取要注入的实现类。

sjkflw121150的博客 377

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: Seata+TCC 解决分布式事务,真香!
下一篇: SpringBoot + ITextPdf:高效生成 PDF 预览文件
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值