Dubbo的SPI实现非常类似于原生的JAVA的SPI:它只是提供一种协议,并没有提供相关插件化实施的接口。
熟悉Java SPI的同学都知道Java SPI原生的支持类:ServiceLoader,通过声明接口的实现类,在META-INF/services中注册一个实现类,然后通过ServiceLoader去生成一个接口实例,当更换插件的时候只需要把自己实现的插件替换到META-INF/services中即可。
Java SPI示例
1、定义一个接口 com.bytebeats.demo.spi.service.HelloService
, 如下:
public interface HelloService {
String sayHello(String msg);
}
2、接口实现类
HelloService 接口的实现类有两个:com.bytebeats.demo.spi.service.impl.DefaultHelloService
和 com.bytebeats.demo.spi.service.impl.CustomHelloService
。
3、注册
在resources 目录下创建META-INF/services/interface 文件,maven 项目结构如下:
| - 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文件内容为:
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");
}