SPI 是什么
SPI 全稱 Service Provider Interface,是 Java 提供的一套用來被第三方實現(xiàn)或者擴展的 API,它可以用來啟用框架擴展和替換組件。
整體機制如下圖
Java SPI 實際上是 “基于接口的編程+策略模式+配置文件” 組合實現(xiàn)的動態(tài)加載機制。
使用場景
適用于:調(diào)用者根據(jù)實際使用需要,啟用、擴展、或者替換框架的實現(xiàn)策略
比較常見的例子:
數(shù)據(jù)庫驅(qū)動加載接口實現(xiàn)類的加載,JDBC 加載不同類型數(shù)據(jù)庫的驅(qū)動
日志門面接口實現(xiàn)類加載,SLF4J 加載不同提供商的日志實現(xiàn)類
Spring 中大量使用了 SPI, 比如:對 servlet3.0 規(guī)范對 ServletContainerInitializer 的實現(xiàn)、自動類型轉(zhuǎn)換 Type Conversion SPI (Converter SPI、Formatter SPI) 等
Dubbo 中也大量使用 SPI 的方式實現(xiàn)框架的擴展,不過它對 Java 提供的原生 SPI 做了封裝,允許用戶擴展實現(xiàn) Filter 接口
使用介紹
要使用 Java SPI,需要遵循如下約定:
當服務(wù)提供者提供了接口的一種具體實現(xiàn)后,在 jar 包的 META-INF/services 目錄下創(chuàng)建一個以 “接口全限定名” 為命名的文件,內(nèi)容為實現(xiàn)類的全限定名;
接口實現(xiàn)類所在的 jar 包放在主程序的 classpath 中;
主程序通過 java.util.ServiceLoder 動態(tài)裝載實現(xiàn)模塊,它通過掃描 META-INF/services 目錄下的配置文件找到實現(xiàn)類的全限定名,把類加載到 JVM;
SPI 的實現(xiàn)類必須攜帶一個不帶參數(shù)的構(gòu)造方法;
總結(jié)
優(yōu)點:使用 Java SPI 機制的優(yōu)勢是實現(xiàn)解耦,使得第三方服務(wù)模塊的裝配控制的邏輯與調(diào)用者的業(yè)務(wù)代碼分離,而不是耦合在一起。應(yīng)用程序可以根據(jù)實際業(yè)務(wù)情況啟用框架擴展或替換框架組件。
缺點:
雖然 ServiceLoader 也算是使用的延遲加載,但是基本只能通過遍歷全部獲取,也就是接口的實現(xiàn)類全部加載并實例化一遍。如果你并不想用某些實現(xiàn)類,它也被加載并實例化了,這就造成了浪費。獲取某個實現(xiàn)類的方式不夠靈活,只能通過 Iterator 形式獲取,不能根據(jù)某個參數(shù)來獲取對應(yīng)的實現(xiàn)類。
多個并發(fā)多線程使用 ServiceLoader 類的實例是不安全的。
審核編輯:劉清
-
驅(qū)動器
+關(guān)注
關(guān)注
54文章
9118瀏覽量
156575 -
SPI接口
+關(guān)注
關(guān)注
0文章
289瀏覽量
36909 -
JAVA語言
+關(guān)注
關(guān)注
0文章
138瀏覽量
21658 -
JVM
+關(guān)注
關(guān)注
0文章
161瀏覽量
13088 -
解耦控制
+關(guān)注
關(guān)注
0文章
29瀏覽量
10468
原文標題:淺析 Java - SPI 機制
文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
Java的SPI機制詳解
SPI接口總線介紹
SPI接口的應(yīng)用與基于FPGA的SPI自動發(fā)送模塊設(shè)計
spi從機程序設(shè)計_spi從機程序代碼詳細介紹
英創(chuàng)信息技術(shù)JAVA操作英創(chuàng)主板SPI接口簡介
fireflyAIO-3288J主板SPI使用介紹
spi協(xié)議介紹
源碼級深度理解Java SPI
Java、Spring、Dubbo三者SPI機制的原理和區(qū)別
SPI通用接口層介紹
SPI接口的相關(guān)介紹
SPI是什么?Java SPI的使用介紹
評論