Java spi机制(开发类似mysql的sql解析和运算工具)
前言
最近公司做了一款数据处理工具,需要支持类似于mysql一样的sql解析/运算,且要求易扩展。于是使用了spi机制,通过spi机制可以在业务存在添加新算子(运算函数)的情况下可以不用改动原来项目的代码也不用重新编译,以增量插件的方式便可以将新算子(运算函数)发布到项目中去。
简介
SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。主要思想就是“解耦”。
使用场景
适用于:调用者根据实际使用需要,启用、扩展、或者替换框架的实现策略。不需要改动源码就可以实现扩展,解耦;实现扩展对原来的代码几乎没有侵入性;只需要添加配置就可以实现扩展,符合开闭原则。
我们先说说效果,如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加载实现类:
本文地址:https://blog.csdn.net/qq_31247885/article/details/108035276