1.What is SPI?
SPI是上游产商给服务供应商提供的接口,供应商遵循接口契约提供自己的实现.。提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。 基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里制定。简单来讲就是为某个接口寻找服务实现的机制。
2.SPI & dubbo
对于多数看过dubbo源码的小伙伴,对于SPI应该再熟悉不过了,几乎多数的部分都是通过spi实现的。
此图来源于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做比较。
谢谢收看,下期见!!!