Java SPI 简易实现

young 649 2021-10-23

SPI定义

SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。

常见例子:

JDBC加载不同的数据库驱动
日志框架加载不同厂商的日志实现
....

SPI使用:

  1. 接口实现者,必须在自身jar包的META-INF/services目录下创建一个以实现接口全限定名称命名的文件,内容为实现类的全限定名,如果有多个实现类,需按行写入
  2. 实现类必须有一个无参构造
  3. 调用方程序通过java.util.ServiceLoader动态加载实现类到JVM中

示例代码

  1. 定义接口
public interface TestInterface {
    void process(Object... args);
}

项目结构
spitestinterface.png

  1. 实现接口
public class SpiInstance implements TestInterface {
    @Override
    public void process(Object... args) {
        System.out.println("SPI INSTANCE");
        if (null != args){
            for (Object arg : args) {
                System.out.println(arg);
            }
        }
    }
}
  1. 创建配置文件
    文件名称:young.spi.TestInterface
    文件内容:young.spiinstance.SpiInstance
    项目结构:
    spitestinstance.png

  2. 加载接口

public static void main(String[] args) {
        ServiceLoader<TestInterface> load = ServiceLoader.load(TestInterface.class);
        for (TestInterface testInterface : load) {
            System.out.println(testInterface.getClass().getName());
            testInterface.process("test spi");
        }
    }

运行结果:
spitest1.png
项目结构:
spitest.png