美文网首页微服务
概念3:SPI与API

概念3:SPI与API

作者: 朝朝Mumu | 来源:发表于2021-05-24 20:27 被阅读0次

SPI基本概念示例

今天调研内存计算时看到了SPI这个术语,做个记录。

什么是SPI?

SPI ,全称为 Service Provider Interface,是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。

这一机制为很多框架扩展提供了可能,比如在Dubbo、JDBC中都使用到了SPI机制。

简单例子

Show me code

首先,我们需要定义一个接口,SPIService

package com.viewscenes.netsupervisor.spi;
public interface SPIService {
    void execute();
}

然后,定义两个实现类,没实际含义,只输入一句话。

package com.viewscenes.netsupervisor.spi;
public class SpiImpl1 implements SPIService{
    public void execute() {
        System.out.println("SpiImpl1.execute()");
    }
}
----------------------我是分割线----------------------
package com.viewscenes.netsupervisor.spi;
public class SpiImpl2 implements SPIService{
    public void execute() {
        System.out.println("SpiImpl2.execute()");
    }
}

最后呢,要在ClassPath路径下配置添加一个文件。文件名字是接口的全限定类名,内容是实现类的全限定类名,多个实现类用换行符分隔。

文件路径如下:

image-20201214092056547.png

内容就是实现类的全限定类名:

com.viewscenes.netsupervisor.spi.SpiImpl1
com.viewscenes.netsupervisor.spi.SpiImpl2

Let me see!

然后我们就可以通过ServiceLoader.load或者Service.providers方法拿到实现类的实例。其中,Service.providers包位于sun.misc.Service,而ServiceLoader.load包位于java.util.ServiceLoader

public class Test {
    public static void main(String[] args) {    
        Iterator<SPIService> providers = Service.providers(SPIService.class);
        ServiceLoader<SPIService> load = ServiceLoader.load(SPIService.class);

        while(providers.hasNext()) {
            SPIService ser = providers.next();
            ser.execute();
        }
        System.out.println("--------------------------------");
        Iterator<SPIService> iterator = load.iterator();
        while(iterator.hasNext()) {
            SPIService ser = iterator.next();
            ser.execute();
        }
    }
}

两种方式的输出结果是一致的:

SpiImpl1.execute()
SpiImpl2.execute()
--------------------------------
SpiImpl1.execute()
SpiImpl2.execute()

整理记录,以备后续。

API跟SPI没什么相关性,就是名字有点像。
API,英文全称Application Programming Interface,翻译为“应用程序编程接口”。
API就是接口,就是通道,就是中介,负责一个程序和其他软件的沟通,本质是预先定义的函数。

相关文章

  • 概念3:SPI与API

    SPI基本概念示例 今天调研内存计算时看到了SPI这个术语,做个记录。 什么是SPI? SPI ,全称为 Serv...

  • 浅谈Java SPI原理与其在JDBC、Flink中的应用

    API vs SPI API(Application Programming Interface)的概念对我们来说...

  • SPI 与 API

    背景 Java 中区分 API 和 SPI,通俗的讲:API 和 SPI 都是相对的概念,他们的差别只在语义上,A...

  • java之spi详解

    作者:zen API与SPI API (Application Programming Interface)是我们...

  • SPI与API

    SPI与我们熟知的API名字上有点相似,SPI被称为服务提供接口,API称为应用程序接口,两者的区别大致可以这样来...

  • API与SPI

    在看dubbo源码的时候,发现里面大量的使用了SPI机制,而对于很多的人来说,SPI还是一个相对陌生的概念(我也是...

  • java原生SPI

    SPI概念 spi提供了一种机制可以用来被第三方扩展和实现 spi的核心作用就是为这些api寻找实现 java原生...

  • 三:dubbo中的设计原则

    1:一些设计上的基本常识 (1)API与SPI分离 API:Application Programming Int...

  • [119]java spi探讨

    什么是spi spi全名为service provider interface,它是一种api,该api允许被第三...

  • SPI 学习

    1. 什么是 SPI,和 API 有什么区别? SPI (Service Provider Interface),...

网友评论

    本文标题:概念3:SPI与API

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