一、概述
SPI全称(Service Provider Interface),是JDK内置的一种服务提供发现机制;SPI机制提供了组件发现和注册方式,可以为应用程序提供灵活的插件机制, 主要原理:接口 + 反射+ 配置文件。
二、规范
定义接口,并为接口提供具体的实现类,实现模块之间的解耦;具体规则如下:
- 在接口实现模块的resources目录下新建 META-INF/services/目录,并在META-INF/services目录下新建文件:
- 文件名为SPI接口的权限定名。
- 文件内容为该接口的具体实现类的权限定名。
- 将SPI所在的jar放在主程序的classpath中。
- 服务调用方使用 java.util.ServiceLoader去动态加载META-INF/services目录下具体的实现类到JVM中。
注意:也可以使用@AutoService(xxx.class)注解,无需手动创建目录文件,会在maven打包时自动创建相应的文件,maven依赖如下:
<dependency><groupId>com.google.auto.service</groupId><artifactId>auto-service-annotations</artifactId><version>1.0.1</version>
</dependency>
三、实践Demo
新建三个模块
(1)模块:java-spi-application 对应应用程序
pom.xml
(2)模块:java-spi-interface对应spi接口定义
- 定义接口:
- 定义工厂,此处为加载SPI接口实现类的入口:
(3)模块:java-spi-provider - SPI接口实现类:
- 在接口实现模块的resources目录下新建 META-INF/services/目录,并在META-INF/services目录下新建文件