利用Spring插件实现策略模式的案例详解

 更新时间:2023年05月24日 08:40:36   作者:linyb极客之路  
Spring插件提供了一种更实用的插件开发方法,它提供了插件实现扩展核心系统功能的核心灵活性,但当然不提供核心OSGi功能,如动态类加载或运行时安装和部署插件,本文就来聊下如何使用spring插件来实现策略模式,需要的朋友可以参考下

前言

偶然的机会发现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-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,不然插件会找不到

到此这篇关于利用Spring插件实现策略模式的案例详解的文章就介绍到这了,更多相关Spring插件实现策略模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot启动后立即执行的几种方法小结

    SpringBoot启动后立即执行的几种方法小结

    在项目开发中某些场景必须要用到启动项目后立即执行方式的功能,本文主要介绍了SpringBoot启动后立即执行的几种方法小结,具有一定的参考价值,感兴趣的可以了解一下
    2023-05-05
  • 浅谈java异常处理(父子异常的处理)

    浅谈java异常处理(父子异常的处理)

    下面小编就为大家带来一篇浅谈java异常处理(父子异常的处理)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • java继承的概念及案例解析

    java继承的概念及案例解析

    这篇文章主要介绍了java继承的概念及案例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 手把手教你SpringBoot过滤器N种注册方式

    手把手教你SpringBoot过滤器N种注册方式

    这篇文章主要介绍了手把手教你SpringBoot过滤器N种注册方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Deepseek整合SpringAI详细流程

    Deepseek整合SpringAI详细流程

    本文介绍了如何使用SpringBoot、Deepseek和SpringAI构建一个简单的问答系统,并通过Postman调用API接口实现问答功能,通过本文,你将学习如何整合这些技术,快速实现一个高效的问答系统,感兴趣的朋友一起看看吧
    2025-02-02
  • Quarkus改造Pmml模型项目异常记录及解决处理

    Quarkus改造Pmml模型项目异常记录及解决处理

    这篇文章主要为大家介绍了Quarkus改造Pmml模型项目是遇到的异常记录以及解决方法,有需要的同学可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • JavaStream将List转为Map示例

    JavaStream将List转为Map示例

    这篇文章主要为大家介绍了JavaStream将List转为Map示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 基于Arrays.sort()和lambda表达式

    基于Arrays.sort()和lambda表达式

    这篇文章主要介绍了Arrays.sort()和lambda表达式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 如何基于sqlite实现kafka延时消息详解

    如何基于sqlite实现kafka延时消息详解

    这篇文章主要给大家介绍了关于如何基于sqlite实现kafka延时消息的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • JDBC数据库连接步骤解析

    JDBC数据库连接步骤解析

    这篇文章主要介绍了JDBC数据库连接步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02

最新评论