一、什么是SPI
SPI的全名為Service Provider Interface.大多數開發人員可能不熟悉,因為這個是針對廠商或者插件的,在java.util.ServiceLoader的檔案里有比較詳細的介紹,簡單的總結下java spi機制的思想,我們系統里抽象的各個模塊,往往有很多不同的實作方案,比如日志模塊的方案,xml決議模塊、jdbc模塊的方案等,面向的物件的設計里,我們一般推薦模塊之間基于介面編程,模塊之間不對實作類進行硬編碼,一旦代碼里涉及具體的實作類,就違反了可拔插的原則,如果需要替換一種實作,就需要修改代碼,為了實作在模塊裝配的時候能不在程式里動態指明,這就需要一種服務發現機制, java spi就是提供這樣的一個機制:為某個介面尋找服務實作的機制,有點類似IOC的思想,就是將裝配的控制權移到程式之外,在模塊化設計中這個機制尤其重要,
1、JDBC中的SPI
jdbc4.0以前, 開發人員還需要基于Class.forName("xxx")的方式來裝載驅動,jdbc4也基于spi的機制來發現驅動提供商了,可以通過META-INF/services/java.sql.Driver檔案里指定實作類的方式來暴露驅動提供者.

現在的我們獲取JDBC的connection

DriverManager 在初始化前會呼叫如下方法

2、SPI的使用


在該檔案中添加實作類:
com.jalja.data.spi.video.TencentVideo
com.jalja.data.spi.video.AiqiyiVideo

3、SPI的原理
使用當前執行緒的類加載器去加載

使用反射創建各個實作類的實體

二、Dubbo中的SPI
首先,從上面的java spi的原理中可以了解到,java的spi機制有著如下的弊端:
- 只能遍歷所有的實作,并全部實體化,
- 組態檔中只是簡單的列出了所有的擴展實作,而沒有給他們命名,導致在程式中很難去準確的參考它們,
dubbo作為一個高度可擴展的rpc框架,也依賴于java的spi,并且dubbo對java原生的spi機制作出了一定的擴展,使得其功能更加強大,dubbo的spi有如下幾個概念:
- 擴展點:一個介面,
- 擴展:擴展(介面)的實作,
- 擴展點加載器:ExtensionLoader
- 擴展自適應實體:其實就是一個Extension的代理,它實作了擴展點介面,在呼叫擴展點的介面方法時,會根據實際的引數來決定要使用哪個擴展,dubbo會根據介面中的引數,自動地決定選擇哪個實作,

- @SPI:該注解作用于擴展點的介面上,表明該介面是一個擴展點,
- @Adaptive:@Adaptive注解用在擴展介面的方法上,表示該方法是一個自適應方法,Dubbo在為擴展點生成自適應實體時,如果方法有@Adaptive注解,會為該方法生成對應的代碼,
Dubbo SPI 檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/281392.html
標籤:其他
