SPI-Service Provider Interface

本贴最后更新于 2842 天前,其中的信息可能已经东海扬尘

今天主要是结合代码简单介绍下 SPI 的功能以及 SPI 的应用。

SPI

SPI-Service Provider Interface 的简写,对服务的一种扩展,可以对已知的服务进行实现并以类似插件的方式进行加载,供服务定义方进行调用。

规范--服务的扩展

  1. 实现服务接口
  2. 在工程 META-INF 目录下新增 services 文件夹,如:META-INF/services
  3. 在 services 文件夹内新增以接口全路径为文件名的文件,如:META-INF/services/com.example.interfaceName
  4. 在文件内写上接口的实现类的全路径,如:com.example.impl.ClassName

规范--服务加载方

  1. 通过 java.util.ServiceLoader#load(java.lang.Class) 方法来加载服务的实现。
  2. load 方法返回 ServiceLoader,实现了 Iterable,可以直接 for-each 来遍历服务的实现。

示例

  • 利用三方 jar 包来利用注解生成 META-INFO/services, 注解:@MetaInfServices
  org.kohsuke.metainf-services metainf-services 

服务提供方:

@MetaInfServices
public class Say implements SayHello {

 public String say() { return "hello"; }}

服务调用方:

        ServiceLoader services = ServiceLoader.load(SayHello.class);
        for (SayHello sayHello : services) {
            sayHello.say();
        }

示例代码地址:https://github.com/Justice-love/spi

问题

  • spring boot 的 auto-config 和 spring schema 的扩展是使用的类似 SPI 的方式进行加载的还是使用 OSGI 的方式呢?
  • SPI 和 OSGI 的差别?

原文地址 http://justice-love.com/SPI/

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • SPI

    Service Provider Interface

    12 引用 • 2 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...