之前只听过API(Application Programming Interface), 偶然在公司的源码中看到一个ExtensionLoader这个类,字面的意思是拓展加载器,在之前学的JVM的类加载机制双亲委派模型其中有Bootstrap,Extension,Application加载器。
通过这个类获取某个接口的具体的实现类,后来学习到了一个新的单词叫做SPI(Service Provider Interface), 服务的提供者在实现一个接口后,在META-INF目录下的services目录下创建相应接口的名称的文件,文件内容为服务提供者实现接口的类的全限定名:
mysql提供的Driver实现
在程序中DriverManager.getDriver(“com.mysql.jdbc.Driver”)就会从services目录下加载这个类
API和SPI
自己的理解:API通过调用SPI接口的方法实现功能,而程序会寻找这个SPI的实现来完成相应的功能,API不管SPI的具体的实现,感觉SPI是API的基础。
demo
public interface Search {
List<String> search();
}
public class CacheSearch implements Search {
@Override
public List<String> search() {
System.out.println("Search in cache.");
return null;
}
}
public class DataBaseSearch implements Search {
@Override
public List<String> search() {
System.out.println("Search in database.");
return null;
}
}
// 通过ServiceLoader加载实现类
public static void main(String[] args) {
ServiceLoader<Search> searchServiceLoader = ServiceLoader.load(Search.class);
for (Search search : searchServiceLoader) {
search.search();
}
}