spi机制

前言

最近公司做了一款数据处理工具,需要支持类似于mysql一样的sql解析/运算,且要求易扩展。于是使用了spi机制,通过spi机制可以在业务存在添加新算子(运算函数)的情况下可以不用改动原来项目的代码也不用重新编译,以增量插件的方式便可以将新算子(运算函数)发布到项目中去。

简介

SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。主要思想就是“解耦”。

spi整体机制

使用场景

适用于:调用者根据实际使用需要,启用、扩展、或者替换框架的实现策略。不需要改动源码就可以实现扩展,解耦;实现扩展对原来的代码几乎没有侵入性;只需要添加配置就可以实现扩展,符合开闭原则。
我们先说说效果,如sql:select sum(amount) from order处理工具已经写好sum函数逻辑并且已经发布到生产目录,现在需要新添加一个count()的函数功能。
这是我的生产项目目录:
在这里插入图片描述
现在我只需要新建一个普通的java项目,里面创建两个文件,实现一个接口便可以将该项目打包好的jar包放入lib目录。
在这里插入图片描述
重启项目,count函数便可以在sql中正常使用了。

spi例子

先定义一个接口:

package com.example.service;

import java.util.List;

/**
 * @author hehai
 * @Date 2020/7/7
 * @REMARK:
 */
public interface EvaluateService {

    List<String> evaluat(String value);

}

实现接口:

package com.example.service.impl;

import com.example.service.EvaluateService;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author hehai
 * @Date 2020/7/7
 * @REMARK:
 */
public class EvaluateServiceImpl implements EvaluateService {
    @Override
    public List<String> evaluat(String value) {
        System.out.println("我是测试spi:" + value);
        return null;
    }
}

然后需要在resources目录下新建META-INF/services目录,并且在这个目录下新建一个与上述接口的全限定名一致的文件,在这个文件中写入接口的实现类的全限定名:
在这里插入图片描述
通过serviceLoader加载实现类:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值