SPI入门

之前只听过API(Application Programming Interface), 偶然在公司的源码中看到一个ExtensionLoader这个类,字面的意思是拓展加载器,在之前学的JVM的类加载机制双亲委派模型其中有Bootstrap,Extension,Application加载器。

通过这个类获取某个接口的具体的实现类,后来学习到了一个新的单词叫做SPI(Service Provider Interface), 服务的提供者在实现一个接口后,在META-INF目录下的services目录下创建相应接口的名称的文件,文件内容为服务提供者实现接口的类的全限定名:

mysql提供的Driver实现
SPI入门_第1张图片

在程序中DriverManager.getDriver(“com.mysql.jdbc.Driver”)就会从services目录下加载这个类

API和SPI
自己的理解:API通过调用SPI接口的方法实现功能,而程序会寻找这个SPI的实现来完成相应的功能,API不管SPI的具体的实现,感觉SPI是API的基础。

demo

public interface Search {
    List search();
}

public class CacheSearch implements Search {
    @Override
    public List search() {
        System.out.println("Search in cache.");
        return null;
    }
}

public class DataBaseSearch implements Search {

    @Override
    public List search() {
        System.out.println("Search in database.");
        return null;
    }
}
 // 通过ServiceLoader加载实现类
 public static void main(String[] args) {
        ServiceLoader searchServiceLoader = ServiceLoader.load(Search.class);
        for (Search search : searchServiceLoader) {
            search.search();
        }
 }

这里写图片描述

SPI入门_第2张图片

你可能感兴趣的:(Java)