SpringBoot神器SPI机制学习!!!

本文深入探讨了SpringBoot的SPI机制,通过实例展示了如何使用SPI轻松扩展支付功能,如添加新的支付方式。在原有支付宝和微信支付的基础上,仅需两步即可实现银联支付的集成,降低了代码耦合,简化了扩展流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

SpringBoot的零配置之一就是基于SPI。能很好的做扩展。
本篇学习下SpringBoot集成第三方技术的核心前置知识SPI的模式。


例子

ServiceLoader类是java.util下的
在这里插入图片描述
接口,解析文档的接口

public interface IPraseDoc {
    void prase();
}

解析Excel的实现类

public class ExcelParse implements IPraseDoc {
    @Override
    public void prase() {
        System.out.println("解析excel");
    }
}

假设我们现在要加个解析Word的实现类,那这里呢我们不用工厂方法模式。用SPI的方式去做。

加个解析Word实现类

public class WordParse implements IPraseDoc {
    @Override
    public void prase() {
        System.out.println("解析word");
    }
}

配置我们的SPI
在这里插入图片描述
编写启动测试

public class MainStart {

    public static void main(String[] args) {
        ServiceLoader<IPraseDoc> serviceLoader=
        				ServiceLoader.load(IPraseDoc.class);
        for (IPraseDoc iPraseDoc : serviceLoader) {
                iPraseDoc.prase();
                //还可以去走某个接口
                //if(iPraseDoc instanceof WordParse){
                //iPraseDoc.prase();
                //}
        }
    }
}

运行结果:
在这里插入图片描述
这样的话我们新加的接口都可以在配置文件里装入。代码的耦合性大大降低。

原理:原理就是反射的方式。

在这里插入图片描述

例子2

利用SPI机制再来实现个类似支付平台的功能
在这里插入图片描述

在这里插入图片描述
公用的支付接口

public interface PayStrategy {
    /**
     * 共同方法
     * @return
     */
    String toPayHtml();
}

支付宝支付的方式

public class AliPayStrategy implements PayStrategy {
    @Override
    public String toPayHtml() {
        return "支付宝支付";
    }
}

微信支付的方式

public class WeiXInPayStrategy implements PayStrategy {
    @Override
    public String toPayHtml() {
        return "微信支付";
    }
}

根据支付类型进行相应调用的类

public class PayContextStrategy {
    public static void getPayStrategy(Class<?> clazz) {
        ServiceLoader<PayStrategy> serviceLoader=ServiceLoader.load(PayStrategy.class);
        for (PayStrategy payStrategy : serviceLoader) {
            if(payStrategy.getClass()==clazz){
                System.out.println(payStrategy.toPayHtml());
                break;
            }
        }
    }
}

进行微信支付的调用

public static void main(String[] args) {
        getPayStrategy(WeiXInPayStrategy.class);
    }

在这里插入图片描述

现在假设有个需求我们要新增银联支付

在这里插入图片描述
在这里插入图片描述
只需要进行这两步,我们就完成了银联支付

上边的例子非常简单,实际业务中,我们还需要堆入参和出参,回调等进行相关的编写,但是骨架是这样的,我们进行不同的扩展添加即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值