SPI 简介

SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现

简单来说,它就是一种动态替换发现的机制, 举个例子来说, 有个接口,想运行时动态的给它添加实现,你只需要添加一个实现

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

而后,把新加的实现,描述给JDK知道就行啦(通过改一个文本文件即可) 公司内部,目前Dubbo框架就基于SPI机制提供扩展功能。

简单示例

通过一个简单例子来说明SPI是如何使用的。 首先通过一张图来看看,用SPI需要遵循哪些规范,因为spi毕竟是JDK的一种标准。 Java SPI机制简介 随笔 第1张 我们首先需要一个目录,META-INF\services 如下,最终的目录路径就像这样:

1
2 3 4 5 6 7 8 9 10 11 12 
└── src ├── com │   └── ivanzhang │   └── spi │   ├── HelloInterface.java │   ├── impl │   │   ├── ImageHello.java │   │   └── TextHello.java │   └── SPIMain.java └── META-INF  └── services  └── com.ivanzhang.spi.HelloInterface

文件名字为 接口/抽象类: 全名 文件内容: 接口/抽象类 实现类

就像这样: com.ivanzhang.spi.impl.TextHello com.ivanzhang.spi.impl.ImageHello

接下来, 我们需要定义接口和实现类:

1
2 3 
public interface HelloInterface {  public void sayHello(); }

实现类:

1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 
public class TextHello implements HelloInterface {   @Override  public void sayHello() {  System.out.println("Text Hello.");  }  }  public class ImageHello implements HelloInterface {  @Override  public void sayHello() {  System.out.println("Image Hello");  } }

最后,来看看,如果使用SPI机制,客户端代码:

1
2 3 4 5 6 7 8 9 10 11 
public class SPIMain {  public static void main(String[] args) {   ServiceLoader<HelloInterface> loaders =  ServiceLoader.load(HelloInterface.class);   for (HelloInterface in : loaders) {  in.sayHello();  }  } }

最后的输出: Text Hello.Image Hello

,

SPI 简介

SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现

简单来说,它就是一种动态替换发现的机制, 举个例子来说, 有个接口,想运行时动态的给它添加实现,你只需要添加一个实现

而后,把新加的实现,描述给JDK知道就行啦(通过改一个文本文件即可) 公司内部,目前Dubbo框架就基于SPI机制提供扩展功能。

简单示例

通过一个简单例子来说明SPI是如何使用的。 首先通过一张图来看看,用SPI需要遵循哪些规范,因为spi毕竟是JDK的一种标准。 Java SPI机制简介 随笔 第2张 我们首先需要一个目录,META-INF\services 如下,最终的目录路径就像这样:

1
2 3 4 5 6 7 8 9 10 11 12 
└── src ├── com │   └── ivanzhang │   └── spi │   ├── HelloInterface.java │   ├── impl │   │   ├── ImageHello.java │   │   └── TextHello.java │   └── SPIMain.java └── META-INF  └── services  └── com.ivanzhang.spi.HelloInterface

文件名字为 接口/抽象类: 全名 文件内容: 接口/抽象类 实现类

就像这样: com.ivanzhang.spi.impl.TextHello com.ivanzhang.spi.impl.ImageHello

接下来, 我们需要定义接口和实现类:

1
2 3 
public interface HelloInterface {  public void sayHello(); }

实现类:

1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 
public class TextHello implements HelloInterface {   @Override  public void sayHello() {  System.out.println("Text Hello.");  }  }  public class ImageHello implements HelloInterface {  @Override  public void sayHello() {  System.out.println("Image Hello");  } }

最后,来看看,如果使用SPI机制,客户端代码:

1
2 3 4 5 6 7 8 9 10 11 
public class SPIMain {  public static void main(String[] args) {   ServiceLoader<HelloInterface> loaders =  ServiceLoader.load(HelloInterface.class);   for (HelloInterface in : loaders) {  in.sayHello();  }  } }

最后的输出: Text Hello.Image Hello

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄