SPI初识

作者: 理想不倒210 | 来源:发表于2018-10-25 15:36 被阅读0次

    1.What is SPI?

           SPI是上游产商给服务供应商提供的接口,供应商遵循接口契约提供自己的实现.。提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。 基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里制定。简单来讲就是为某个接口寻找服务实现的机制。

    2.SPI & dubbo

    对于多数看过dubbo源码的小伙伴,对于SPI应该再熟悉不过了,几乎多数的部分都是通过spi实现的。

    dubbo官网架构图

    此图来源于dubbo官网,图片最右面的标注说明:只有Service 和 Config 层为 API,其它各层均为 SPI。可见SPI在dubbo中是多么重要的组成不分。

    3.SPI java 示例

    1.定义接口

    public interface ICall {

           public String call();

    }

    2.增加实现类

    public class DogCall implements ICall{

         public String call() {

                  return "汪汪汪";

          }

    }

    3.在增加文件 com.zxx.spi.ICall

    在路径src/main/resources 路径下增加META-INF/services 路径,并添加

    “com.zxx.spi.ICall” 为文件名的文件。

    内容为:com.zxx.spi.impl.DogCall 注:加粗部分为包名,依项目不同而变。

    4.增加测试类

    public class TestCall {

    public ServiceLoader<ICall> serviceloader = ServiceLoader.load(ICall.class);

    public static void main(String[] args) {

        TestCall testCall = new TestCall();

        ICall icall = testCall.getCall();

        System.out.println(icall.call());

    }

    public ICall getCall() {

        ICall last = null;

        for (ICall call : serviceloader) {

          last = call;

        }

         return last;

    }

    执行文件输出“汪汪汪”。

    好了到此,基础的java spi项目已经实现,之后会对dubbo SPI 与java spi做比较。

    谢谢收看,下期见!!!

    相关文章

      网友评论

          本文标题:SPI初识

          本文链接:https://www.haomeiwen.com/subject/oifctqtx.html