一、概述
最早看到 SPI 這個機制是在 dubbo 實現 中,最近發現原來也不是什么新東西,竟然就是 JDK 中內置的玩意,今天就來一探究竟,看看它到底是什么玩意!
SPI的全稱是 Service Provider Interface,它是一種服務發現機制,它通過在 classPath 路徑下的 META-INF/services 文件夾查找服務實現,自動加載文件里所定義的接口實現類。
二、實現
首先,我們定義了一個接口 HelloService.java 和它的兩個實現類 HelloServiceImplA.java、HelloServiceImplB.java
public interface HelloService {
void hello();
}
public class HelloServiceImplA implements HelloService {
@Override
public void hello() {
System.out.println("Hello! I am ImplA");
}
}
public class HelloServiceImplB implements HelloService {
@Override
public void hello() {
System.out.println("Hello! I am ImplB");
}
}
接着,我們需要在 META-INF/services 下新建文件,文件名為接口全類名,文件內容即接口實現類全類名(多個實現類換行表示)。
最后,就是我們服務發現過程了,需要借助 ServiceLoader 類。
public class HelloServiceTest {
public static void main(String[] args) {
ServiceLoader<HelloService> serviceLoader = ServiceLoader.load(HelloService.class);
Iterator<HelloService> iterator = serviceLoader.iterator();
while (iterator.hasNext()) {
HelloService helloService = iterator.next();
helloService.hello();
}
}
}
三、總結
各位看官覺得如何?這種不用在程序中聲明接口實現,又能夠發起調用的方式,是不是讓人覺得耳目一新!
SPI 的底層實現基本使用了反射機制,通過全類名實例化接口實現,從而發起調用。
SPI 機制為很多框架擴展提供了可能,比如在Dubbo、JDBC中都使用到了SPI機制。
參考博文: