Dubbo的SPI實現(xiàn)非常類似于原生的JAVA的SPI:它只是提供一種協(xié)議疾捍,并沒有提供相關(guān)插件化實施的接口。
熟悉Java SPI的同學(xué)都知道Java SPI原生的支持類:ServiceLoader栏妖,通過聲明接口的實現(xiàn)類乱豆,在META-INF/services中注冊一個實現(xiàn)類,然后通過ServiceLoader去生成一個接口實例吊趾,當更換插件的時候只需要把自己實現(xiàn)的插件替換到META-INF/services中即可宛裕。
Java SPI示例
1、定義一個接口 com.bytebeats.demo.spi.service.HelloService
论泛, 如下:
public interface HelloService {
String sayHello(String msg);
}
2揩尸、接口實現(xiàn)類
HelloService 接口的實現(xiàn)類有兩個:com.bytebeats.demo.spi.service.impl.DefaultHelloService
和 com.bytebeats.demo.spi.service.impl.CustomHelloService
。
3屁奏、注冊
在resources 目錄下創(chuàng)建META-INF/services/interface 文件岩榆,maven 項目結(jié)構(gòu)如下:
| - demo
| - src
| - main
| - java
| - com.bytebeats.demo.spi.service
| - HelloService.java
| - resources
| - META-INF
| - com.bytebeats.demo.spi.service.HelloService
com.bytebeats.demo.spi.service.HelloService文件內(nèi)容為:
com.bytebeats.demo.spi.service.impl.DefaultHelloService
com.bytebeats.demo.spi.service.impl.CustomHelloService
4、使用
ServiceLoader<HelloService> helloServiceLoader=ServiceLoader.load(HelloService.class);
for(HelloService service : helloServiceLoader){
service.sayHello("ricky");
}