SPI:Service Provider Interface,目的是提供接口,讓第三方(服務廠商或擴展框架開發者)提供自定義實現的服務功能。例如,JDBC驅動,可以加載MySQL、Oracle、或者SQL Server等。
SPI約定:
1、在工程的META-INF/services/目錄下,以接口的全限定名作為文件名,文件內容為實現接口的服務類;
2、使用ServiceLoader動態加載META-INF/services下的實現類;
3、接口的實現類需含無參構造函數;
SPI 問題考慮
1、如果在META-INF/services下有接口實現類,存在多個(例如jar包下面也有相應),系統如何處理?
答:會全部加載,ServiceLoader在加載資源文件時,已經考慮了這個問題。
2、SPI,和Dubbo等相比,區別在哪里?
答:SPI的目的是提供給各種不同服務相同的訪問接口。而Dubbo等微服務是將服務拆分形成功能相對獨立的、維護性強的服務。兩者出發點并不一致。