Java SPI(Service Provider Interface)

Posted wuxiaofeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java SPI(Service Provider Interface)相关的知识,希望对你有一定的参考价值。

SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现的机制, 举个例子来说,有个接口,想运行时动态的给它添加实现,你只需要添加一个实现。

当服务的提供者提供了一种接口的实现之后,需要在classpath下的META-INF/services/目录里创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的具体的实现类。当其他的程序需要这个服务的时候,就可以通过查找这个jar包(一般都是以jar包做依赖)的META-INF/services/中的配置文件,配置文件中有接口的具体实现类名,可以根据这个类名进行加载实例化,就可以使用该服务了。JDK中查找服务的实现的工具类是:java.util.ServiceLoader。

SPI实例

定义接口

package org.cellphone.api;

public interface DataSource {

    String getConnection();
}

Oracle厂商实现接口

package org.cellphone.oracle;

import org.cellphone.api.DataSource;

public class DataSourceImpl implements DataSource {
    @Override
    public String getConnection() {
        return "Oracle提供数据库连接池";
    }
}

并在classpath下的META-INF/services/目录下以接口全路径名定义文件:org.cellphone.api.DataSource,文件内容为:

org.cellphone.oracle.DataSourceImpl

mysql厂商实现接口

package org.cellphone.mysql;

import org.cellphone.api.DataSource;

public class DataSourceImpl implements DataSource {
    @Override
    public String getConnection() {
        return "MySQL提供数据库连接池";
    }
}

并在classpath下的META-INF/services/目录下以接口全路径名定义文件:org.cellphone.api.DataSource,文件内容为:

org.cellphone.mysql.DataSourceImpl

ServiceLoader.load(DataSource.class)读取厂商Oracle、MySQL提供jar包中的文件,ServiceLoader实现了Iterable接口可通过while for循环语句遍历出所有实现。

package org.cellphone.invoker;

import org.cellphone.api.DataSource;

import java.util.ServiceLoader;

public class Main {
    private static ServiceLoader<DataSource> loader = ServiceLoader.load(DataSource.class);

    public static void main(String[] args) {
        for (DataSource source : loader) {
            System.out.println(source.getConnection());
        }
    }
}

 

以上是关于Java SPI(Service Provider Interface)的主要内容,如果未能解决你的问题,请参考以下文章

Java实战源码解析Java SPI(Service Provider Interface )机制原理

Java实战源码解析Java SPI(Service Provider Interface )机制原理

SPI(Service Provider Interface)--通过接口获取服务

Introduction to the Service Provider Interfaces--官方文档

Java的SPI机制与简单的示例

在 Keycloak SPI/Provider 中获取当前用户访问令牌(初始登录时)