SPI應用

需求:在實現全局接口的校驗的時候,我想到的是,

1.首先爲所有的接口創建輸入輸出參數的bean

2.然後爲從aop的切點處獲取方法名,參數等,根據SPI 獲取相應類,然後轉成bean,調用類的檢驗方法(所有的bean 都實現IBean接口)

3.參數校驗通過,再進入方法

接下來研究SPI - Service Provider Interface  服務加載方式

SPI機制的約定

  1. 在 META-INF/services/ 目錄中創建以接口全限定名命名的文件,該文件內容爲API具體實現類的全限定名

  2. 使用 ServiceLoader 類動態加載 META-INF 中的實現類

  3. 如 SPI 的實現類爲 Jar 則需要放在主程序 ClassPath 中

  4. 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());
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章