今天主要是结合代码简单介绍下 SPI 的功能以及 SPI 的应用。
SPI
SPI-Service Provider Interface 的简写,对服务的一种扩展,可以对已知的服务进行实现并以类似插件的方式进行加载,供服务定义方进行调用。
规范--服务的扩展
- 实现服务接口
- 在工程 META-INF 目录下新增 services 文件夹,如:META-INF/services
- 在 services 文件夹内新增以接口全路径为文件名的文件,如:META-INF/services/com.example.interfaceName
- 在文件内写上接口的实现类的全路径,如:com.example.impl.ClassName
规范--服务加载方
- 通过
java.util.ServiceLoader#load(java.lang.Class)
方法来加载服务的实现。 - 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 的差别?
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于