0
点赞
收藏
分享

微信扫一扫

java spi

谷中百合517 2022-02-21 阅读 86
javaapi

什么是SPI?

SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。SPI是一种动态替换发现的机制, 比如有个接口,想运行时动态的给它添加实现,你只需要添加一个实现。我们经常遇到的就是java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现,mysql和postgresql都有不同的实现提供给用户,而Java的SPI机制可以为某个接口寻找服务实现。

SPI的用途

数据库DriverManager、Spring、ConfigurableBeanFactory等都用到了SPI机制,这里以数据库DriverManager为例,看一下其实现的内幕。

​ DriverManager是jdbc里管理和注册不同数据库driver的工具类。针对一个数据库,可能会存在着不同的数据库驱动实现。我们在使用特定的驱动实现时,不希望修改现有的代码,而希望通过一个简单的配置就可以达到效果。 在使用mysql驱动的时候,会有一个疑问,DriverManager是怎么获得某确定驱动类的?我们在运用Class.forName(“com.mysql.jdbc.Driver”)加载mysql驱动后,就会执行其中的静态代码把driver注册到DriverManager中,以便后续的使用。

示例

在这里插入图片描述
api模块中定义一个接口
public interface Testervice {
String demo(String params);
}
demo-api中实现其接口
在这里插入图片描述
在其resource目录下创建文件
在这里插入图片描述
com.keyten.api.service.Testervice是api下接口包名+类名,
在这里插入图片描述
com.example.demospi.demo.Demo 是其实现类
producer模块中调用,
public class Load {

private Load(){}

private static Testervice testervice;

static {

    ServiceLoader<Testervice> load = ServiceLoader.load(Testervice.class);
    for (Testervice testervice1 : load) {
        if (testervice1 !=null) testervice = testervice1;
    }
}

public static Testervice getTestervice() {
    return testervice;
}

}

public static void main(String[] args) {

    Testervice testervice = Load.getTestervice();
    String aaa = testervice.demo("aaa");
    System.out.println(aaa);

}
举报

相关推荐

0 条评论