java的SPI机制

SPI 是 JDK 内置的一种服务提供发现机制。

简介

Java 提供的 SPI(service provider interface)机制 是 JDK 内置的一种服务提供发现机制。目前市面上有很多框架都是用它来做服务的扩展发现。简单来说,它是一种动态替换发现的机制。举个简单的例子,我们想在运行时动态给服务添加实现,你只需要添加一个实现,然后把新的实现描述给 JDK 知道就行了。如 JDBC、日志框架都有用到,经常使用的mysql jar包就是这样实现JDBC接口的。

实现 SPI 需要遵循的标准

实现一个标准的 SPI 发现机制,只需要满足以下要求就行了

  1. 需要在 classpath 下创建一个目录,该目录命名必须是:META-INF/services

  2. 在该目录下创建一个文本文件,该文件需要满足以下几个条件

    1
    2
    3
    文件名必须是扩展的接口的全路径名称  
    文件内部描述的是该扩展接口的所有实现类
    文件的编码格式是 UTF-8
  3. 通过 java.util.ServiceLoader 的加载机制来发现

代码实现

创建三个maven项目
dxy-api:定义接口
dxy-java-spi:实现接口,并实现spi
dxy-app:加载spi

dxy-api

定义接口

1
2
3
4
public interface HelloService {

String sayHello(String name);
}

dxy-java-spi

依赖dxy-api,并实现接口

1
2
3
4
5
6
7
8
9
public class MyHelloServiceImpl implements HelloService
{

@Override
public String sayHello(String name)
{
return "My own java spi say " + name;
}
}

dxy-app

加载spi

1
2
3
4
5
6
7
8
9
10
11
public class Main
{
public static void main(String[] args) throws Exception {
System.out.println("Hello World!");
ServiceLoader<HelloService> serviceLoader = ServiceLoader.load(HelloService.class);
for (HelloService helloService : serviceLoader)
{
System.out.println(helloService.sayHello("test"));
}
}
}

运行结果
Hello World!
My own java spi say test

代码

gitee

打赏

请我喝杯咖啡吧~

支付宝
微信