天天看點

Java:SPI機制

【參考文章】:Java SPI機制詳解

【參考文章】:JDK和Spring中SPI的實作原理和差別

【參考文章】:了解的Java中SPI機制

1. 簡介

  SPI 全稱為 (Service Provider Interface) ,是JDK内置的一種服務提供發現機制,通過該方式可實作插件化開發;

  一般是Java定義了API接口,由第三方進行實作,程式運作時動态加載第三方的實作類,根據第三方的具體實作完成接口的功能;

2. 使用方式

  1. 定義一個 interface 接口;

  2. 第三方實作該接口,完成具體功能的實作;

  3. 加載classpath下或者jar包下的META-INF/services 目錄下檔案,檔案名以接口的完全限定名(包名+類名)命名,檔案内容是該接口的具體實作類的完全限定名,可以有多個實作類,通過Iterator的方式周遊實作類來加載;

  4. 主程式運作時通過 ServiceLoader.load(Plugin.class)加載具體實作類;

3. 示例

  Java定義了 java.sql.Driver接口,但是沒有實作,具體的實作由第三方提供。  

  JDBC4.0之前,連接配接資料庫的時候,通常會用Class.forName

("com.mysql.cj.jdbc.Driver")

加載資料庫相關的驅動,然後再進行擷取連接配接等的操作。

  JDBC4.0之後不需要Class.forName來加載驅動,直接擷取連接配接即可,這裡就是使用了Java的SPI機制來實作,程式運作時自動加載了實作類;

  

Java:SPI機制

 4. 擴充

  Spring對SPI機制進行了擴充,可以自動将配置類或者bean自動加載到IOC容器,典型的實作就是Spring Boot 的 @EnableAutoConfiguration;

  Spring中使用的類是SpringFactoriesLoader,在org.springframework.core.io.support包中,預設加載 META-INF/spring.factories檔案,檔案内容是需要加載類的完全限定名

  比如 Mybtis的starter依賴:

Java:SPI機制

5.  總結

5.1 優點

  使用Java SPI機制的優勢是實作解耦,使得第三方服務子產品的裝配控制的邏輯與調用者的業務代碼分離。應用程式可以根據實際業務情況啟用架構擴充或替換架構元件。

5.2 缺點

  加載實作類的方式不夠靈活;

  多個并發多線程使用ServiceLoader類的執行個體是不安全的;

如果文章對您有所幫助,可以點一下推薦哦