Dubbo源码解析 - dubbo SPI实现

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.DefaultHelloServicecom.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 helloServiceLoader=ServiceLoader.load(HelloService.class);
for(HelloService service : helloServiceLoader){
    service.sayHello("ricky");
}

你可能感兴趣的:(Dubbo源码解析 - dubbo SPI实现)