聊聊如何利用spring插件来实现策略模式

news2025/1/12 1:44:20

前言

偶然的机会发现spring有个spring-plugin,官网对它的介绍是

Spring Plugin provides a more pragmatic approach to plugin development by providing the core flexibility of having plugin implementations extending a core system’s functionality but of course not delivering core OSGi features like dynamic class loading or runtime installation and deployment of plugins. Although Spring Plugin thus is not nearly as powerful as OSGi, it serves a poor man’s requirements to build a modular extensible application.

大意就是Spring插件提供了一种更实用的插件开发方法,它提供了插件实现扩展核心系统功能的核心灵活性,但当然不提供核心OSGi功能,如动态类加载或运行时安装和部署插件。尽管Spring插件因此不如OSGi强大,但它满足了穷人构建模块化可扩展应用程序的需求。

本文就来聊下如何使用spring插件来实现策略模式

使用spring-plugin插件实现策略模式步骤

1、在项目中的pom引入spring-plugin

 <dependency>
            <groupId>org.springframework.plugin</groupId>
            <artifactId>spring-plugin-core</artifactId>
            <version>2.0.0.RELEASE<version>
        </dependency>

注: springboot 2.2以下版本默认已经集成spring-plugin-core,因此无需指定版本号。不过集成的版本号比较低,而且部分方法与高版本不兼容

2、定义一个实体类,这个实体类后边插件绑定插件类型会用到

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SmsRequest implements Serializable {

    private Map<String,Object> metaDatas;

    private String to;

    private String message;

    private SmsType smsType;


}

3、定义插件实现org.springframework.plugin.core.Plugin接口

public interface SmsPlugin extends Plugin<SmsRequest> {


    SmsResponse sendSms(SmsRequest smsRequest);


}

4、配置激活插件

@EnablePluginRegistries(SmsPlugin.class)
@Configuration
public class SmsPluginActiveConfig {

}

5、定义插件的具体实现类

@Component
public class AliyunSmsPlugin implements SmsPlugin {
    @Override
    public SmsResponse sendSms(SmsRequest smsRequest) {
        System.out.println("来自阿里云短信:" + smsRequest);
        return SmsResponse.builder()
                .code("200").message("发送成功")
                .success(true).result("阿里云短信的回执").build();
    }

    @Override
    public boolean supports(SmsRequest smsRequest) {
        return SmsType.ALIYUN == smsRequest.getSmsType();
    }
}

注:该具体插件必须是spring的bean

6、插件使用

在业务项目注入

@Autowired
private PluginRegistry<SmsPlugin,SmsRequest> pluginRegistry;

通用调用pluginRegistry.getPluginFor方法拿到具体插件

示例

@RequiredArgsConstructor
public class SmsService {


    private final PluginRegistry<SmsPlugin,SmsRequest> pluginRegistry;


    public SmsResponse sendSms(SmsRequest smsRequest){
        Optional<SmsPlugin> smsPlugin = pluginRegistry.getPluginFor(smsRequest);
        return smsPlugin.orElseThrow(() -> new SmsException("Sms plugin is not binder with type : 【" + smsRequest.getSmsType() + "】"))
                .sendSms(smsRequest);


    }
}

7、测试

 @Test
    public void testAliyunSms(){
        SmsRequest smsRequest = SmsRequest.builder()
                .message("模拟使用阿里云短信发送")
                .to("136000000001")
                .smsType(SmsType.ALIYUN)
                .build();

        SmsResponse smsResponse = smsService.sendSms(smsRequest);
        Assert.assertTrue(smsResponse.isSuccess());
        System.out.println(smsResponse);

    }

总结

本文主要通过一个模拟短信发送的示例,演示如何通过spring-plugin来实现策略模式。如果我们对扩展性有要求除了spi,我们也可以考虑使用spring-plugin。不过基于spring-plugin扩展时,要注意具体的插件实现类要为spring的bean,不然插件会找不到

更多详细例子可以查看官网

https://github.com/spring-projects/spring-plugin

demo链接

https://github.com/lyb-geek/springboot-learning/tree/master/springboot-springplugin-strategy

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

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

相关文章

linux上使用系统安装和Docker安装mysql的两种方式

一、安装到linux 1、安装mysql-server 1、在安装之前查看下系统是否已经安装了mysql ls /usr/share2、安装mysql-server sudo apt-get install mysql-server3、再次查看&#xff0c;发现多了个mysql ls /usr/share | grep mysql //在ls打印结果中搜索mysql关键字4、登陆 在…

chatgpt赋能Python-python_lamb

Python Lambdas - 强大的匿名函数 Python是一个充满了强大特性的编程语言&#xff0c;其中之一就是Python的lambda函数。在这篇文章中&#xff0c;我们将介绍Python lambdas的基础知识、使用方法、优缺点以及与普通函数的区别。 什么是Python Lambda函数 Python Lambda函数&…

咖啡「江湖」:从1999到2023

【潮汐商业评论/原创】 “我现在几乎每天都要来杯咖啡&#xff0c;哪怕周末在家休息也是。上班喝美式是为了提神&#xff0c;在家做拉花是享受生活&#xff0c;平时和朋友出去大概率还是会选择咖啡馆&#xff0c;毕竟看起来有氛围还不发胖。”Allen说道。 事实上&#xff0c;…

地铁车辆项目RAMS管理

导读 由于RAMS管理可以为轨道交通提供安全保障&#xff0c;提高运行效率&#xff0c;该管理模式在国外已得到广泛应用&#xff0c;并取得了良好成效。因此引入RAMS管理是确保城市轨道交通车辆安全发展的必然趋势。本文分析地铁车辆项目RAMS管理的必要性&#xff0c;阐述了项目各…

不要做一个透明人:展现真实的自己

✨求关注~ &#x1f600;博客&#xff1a;www.protaos.com 目录&#xff1a; 引言&#xff1a;透明人的困境透明人的定义与特征 2.1 透明人的追求与代价 2.2 社交媒体与透明人现象的关系透明度的局限性 3.1 自我保护与隐私权 3.2 虚假的透明度和个人形象管理重建真实的自我 4.…

城市内涝的原因和解决措施,内涝监测预警助力城市防涝度汛

城市内涝是城市化进程中最遇到的自然灾害&#xff0c;城市内涝不仅会对市民生活造成困扰&#xff0c;也会对城市基础设施和经济发展产生不利影响。因此&#xff0c;及时监测城市内涝现象&#xff0c;对于城市管理和城市安全具有重要意义。本文将深入探讨城市内涝的原因以及针对…

docsify安装(线上文档)

01、docsify 是什么 一款神奇的文档生成利器 自从有了 Markdown&#xff0c; 我就再没用过富文本编辑器&#xff0c;因为 Markdown 的书写有一种心流的感觉。很多博客平台都支持 Markdown 了&#xff0c;即便是不支持&#xff0c;也没关系&#xff0c;可以通过 mdnice 或者 Md…

亚马逊云科技推出全新即用型模型,通过机器学习在几分钟内生成见解

4月10日&#xff0c;亚马逊云科技宣布推出Amazon Amazon SageMaker Canvas中的新功能&#xff0c;这些功能可帮助业务分析师通过机器学习&#xff08;ML&#xff09;在几分钟内从数千个文档、图像和文本行中生成见解。新功能推出后&#xff0c;可以访问即用型模型&#xff0c;创…

六、数据仓库详细介绍(ETL)工具篇下

0x00 前言 上篇&#xff0c;我们介绍了五种传统 ETL 工具和八种数据同步集成工具。 数据仓库详细介绍&#xff08;五.ETL&#xff09;工具篇上 本篇&#xff0c;我们接着介绍两种新型 ETL 工具、大数据发展不同阶段产生的六种主要计算引擎、五种流程控制组件。 最后我们简单…

空间转换案例-3D导航

想要制作这么一个简单的 3D 导航栏需要了解以下几个知识 : 1.空间转换 : 从坐标轴角度除了我们熟知的 X , Y 外还会和 Z 坐标轴 构成一个立体空间, Z轴的位置与我们眼睛视线的方向相同. 空间转换的属性仍然是 transform ,所以可以给他添加 空间的 平移,旋转,缩放 等效果. 2.空…

[问]python中字典dict如何排序sorted?

文章目录 一、sorted使用二、按照keys的顺序对dict中的keys排序三、按照valuse的顺序对dict中的values排序四、按照keys的顺序对dict中的items排序五、按照values的顺序对dict中的items排序六、按照keys的顺序对dict的values排序七、按照values的顺序对dict中的keys排序八、字典…

【Http协议③】http状态码,响应报头,响应正文等知识的学习

前言: 大家好,我是良辰丫,上一篇文章中我们已经学习了http请求的一些知识,这篇文章我将带领大家去领略http响应的风采,不要着急,跟随良辰的步伐,一起去学习http.&#x1f49e;&#x1f49e;&#x1f49e; &#x1f9d1;个人主页&#xff1a;良辰针不戳 &#x1f4d6;所属专栏&a…

单点登录二:登录过程使用摘要算法和加盐的意义以及demo练习

上一篇《springboot项目使用redis、springSecurity、jwt实现单点登录》写了关于单点登录的架子&#xff0c;但是没有实现密码验证的细节。这里使用盐和摘要算法来实现一个密码验证的完整过程demo。 1、依赖没变&#xff0c;还是上一篇内容那些 <dependencies><depen…

职称认定和职称评审有什么区别?甘建二告诉你

职称认定和评审有什么区别呢&#xff1f;通常大家都在说职称认定和评审不知道中间是不是有什么区别&#xff1f;今天甘建二给大家捋一捋&#xff1a; 一、职称认定 职称认定要求学历条件比较严苛的&#xff1a; 1.毕业专业与评审专业一致&#xff0c;不能跨专业认定&#xff0…

基于FPGA的自动曝光算法实现

1 概述 在机器视觉中&#xff0c;自动曝光&#xff08;Auto Exposure&#xff09;是很多成像设备的必备功能。所谓自动曝光&#xff0c;就是根据环境或拍摄物体照明强度自动调节图像传感器的曝光时间&#xff0c;使输出图像的平均灰度&#xff08;亮度&#xff09;保持在一个合…

redis安装和数据类型

关系型数据库和非关系型数据库的区别&#xff1a; ①存储结构不同&#xff0c;关系型数据库是二维表格的方式&#xff0c;非关系型数据库是键值对的形式&#xff08;文档、图文等&#xff09;&#xff1b; ②扩展方式不同&#xff0c;关系型数据库是纵向提升硬件性能&#xf…

嵌入式硬件中Printf函数的原理

作为嵌入式单片机领域小白的我&#xff0c;在查阅STM32、MSP432等串口通信的开发例程时&#xff0c; 总是能看到用 printf&#xff08;&#xff09;这个函数来进行串口的发送功能。 目录 有关printf&#xff08;&#xff09;函数需要解决的疑问&#xff1a; 一、printf&am…

34种ArcGIS常用操作技巧大汇总

概述 ArcGIS产品线为用户提供一个可伸缩的&#xff0c;全面的GIS平台。ArcObjects包含了许多的可编程组件&#xff0c;从细粒度的对象&#xff08;例如单个的几何对象&#xff09;到粗粒度的对象&#xff08;例如与现有ArcMap文档交互的地图对象&#xff09;涉及面极广&#x…

iperf3常用

iperf使用方法详解 iperf3是一款带宽测试工具&#xff0c;它支持调节各种参数&#xff0c;比如通信协议&#xff0c;数据包个数&#xff0c;发送持续时间&#xff0c;测试完会报告网络带宽&#xff0c;丢包率和其他参数。 安装 sudo apt-get install iperf3iPerf3常用的参数&am…

六、数据仓库详细介绍(ETL)方法篇

0x00 前言 上文我们把数据仓库类比我们人类自身&#xff0c;数据仓库“吃”进去的是原材料&#xff08;原始数据&#xff09;&#xff0c;经过 ETL 集成进入数据仓库&#xff0c;然后从 ODS 开始逐层流转最终供给到数据应用&#xff0c;整个数据流动过程中&#xff0c;在一些关…