描述 service provider interface
SPI 是 JDK 内置的一种服务提供发现机制。目前市面上有很多框架都是用它来做服务的扩展发现。简单来说,它是一种动态替换发现的机制。举个简单的例子,我们想在运行时动态给它添加实现,你只需要添加一个实现,然后把新的实现描述给 JDK 知道就行了。
比如mysql 作为最终服务商,会有多个下辖实现厂商与之对接,那如何保证对接中的规范呢?
mysql就提供了一组标准接口,然后不同的厂商可以有不同的实现。
JDK 中的实现
- 1:A服务定义接口
package com.rentao.spi;
public interface DatabaseDriver {
String buildConnect(String txt);
}
- 2: B 服务实现接口
package com.grentao.spi;
public class OracleDriver implements DatabaseDriver{
@Override
public String buildConnect(String s) {
return "Oracle Driver:"+s;
}
}
- 3:B服务增加配置项 META-INF.services
文件名称:接口名称-package com.rentao.spi.DatabaseDriver
文件内容:接口实现类的全路径名称-package com.grentao.spi.OracleDriver
- 4:启动A服务,完成调用
ServiceLoader<DatabaseDriver> serviceLoader=ServiceLoader.load(DatabaseDriver.class);
for(DatabaseDriver databaseDriver:serviceLoader){
System.out.println(databaseDriver.buildConnect("test"));
}
实现 SPI 需要遵循的标准
1. 需要在 classpath 下创建一个目录,该目录命名必须是:META-INF/service
2. 在该目录下创建一个 properties 文件,该文件需要满足以下几个条件
2.1 文件名必须是扩展的接口的全路径名称
2.2 文件内部描述的是该扩展接口的所有实现类
2.3 文件的编码格式是
3. 通过 java.util.ServiceLoader 的加载机制来发现