需求:在實現全局接口的校驗的時候,我想到的是,
1.首先爲所有的接口創建輸入輸出參數的bean
2.然後爲從aop的切點處獲取方法名,參數等,根據SPI 獲取相應類,然後轉成bean,調用類的檢驗方法(所有的bean 都實現IBean接口)
3.參數校驗通過,再進入方法
接下來研究SPI - Service Provider Interface 服務加載方式
SPI機制的約定
-
在 META-INF/services/ 目錄中創建以接口全限定名命名的文件,該文件內容爲API具體實現類的全限定名
-
使用 ServiceLoader 類動態加載 META-INF 中的實現類
-
如 SPI 的實現類爲 Jar 則需要放在主程序 ClassPath 中
-
API 具體實現類必須有一個不帶參數的構造方法
例子:
public interface People { public String speak(); }
public class English implements People{ public String speak() { return "English speak English"; } }
public class Chinese implements People{ public String speak() { return "chinese speak zhongwen"; } }
資源路徑下/META-INF.services/(接口類全路徑)com.atguigu.gmall.SPI
com.atguigu.gmall.SPI.Chinese com.atguigu.gmall.SPI.English
測試類:
@Test public void testSpi(){ ServiceLoader<People> peoples=ServiceLoader.load(People.class); for (People people:peoples){ System.out.println(people.speak()); } }
結果:
chinese speak zhongwen
English speak English
Dubbo SPI 註解
官網解釋:
http://dubbo.apache.org/zh-cn/docs/source_code_guide/dubbo-spi.html
例子:
@SPI public interface People { public String speak(); }
public class English implements People{ public String speak() { return "English speak English"; } }
public class Chinese implements People{ public String speak() { return "chinese speak zhongwen"; } }
資源路徑下/META-INF.services/(接口類全路徑)com.atguigu.gmall.SPI
chinese=com.atguigu.gmall.SPI.Chinese english=com.atguigu.gmall.SPI.English
測試代碼:
@Test public void testDubbo(){ ExtensionLoader<People> extensionLoader= ExtensionLoader.getExtensionLoader(People.class); People chinese = extensionLoader.getExtension("chinese"); System.out.println(chinese.speak()); }