SPI 简介
SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现的机制, 举个例子来说, 有个接口,想运行时动态的给它添加实现,你只需要添加一个实现,而后,把新加的实现描述给JDK知道就行啦(通过改一个文本文件即可) 公司内部,目前Dubbo框架就基于SPI机制提供扩展功能。
简单示例
通过一个简单例子来说明SPI是如何使用的。 首先通过一张图来看看,用SPI需要遵循哪些规范,因为spi毕竟是JDK的一种标准。 我们首先需要一个目录,META-INF\services 如下,最终的目录路径就像这样:
└── 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
接下来, 我们需要定义接口和实现类:
public interface HelloInterface {
public void sayHello();
}
实现类:
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机制,客户端代码:
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