jdk的SPI機制
阿新 • • 發佈:2020-12-07
技術標籤:Java
一、概述
最早看到 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機制。