🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
使用 SPI 需要有提供方与调用方,将会创建如下项目。 ![](https://img.kancloud.cn/8d/ed/8dedf7fc043ad051810af85514e10532_1617x207.png) ``` com-learn-spi-provider SPI提供方 com-learn-spi-consumer SPI调用方 ``` [TOC] # 1. 创建SPI提供方 **1. 创建一个SPI接口** *`com.learn.spi.provider.service.ProviderLoggerService`* ```java public interface ProviderLoggerService { void info(String message); } ``` **2. 实现SPI接口,这里我用2个实现类** (1)*`com.learn.spi.provider.service.impl.Default01LoggerServiceImpl`* ```java public class Default01LoggerServiceImpl implements ProviderLoggerService { @Override public void info(String message) { System.out.println(this.getClass().getSimpleName() + "--" + message); } } ``` (2)*`com.learn.spi.provider.service.impl.Default02LoggerServiceImpl`* ```java public class Default02LoggerServiceImpl implements ProviderLoggerService { @Override public void info(String message) { System.out.println(this.getClass().getSimpleName() + "--" + message); } } ``` **3. 在提供方创建`com.learn.spi.provider.service.ProviderLoggerService`配置文件** 文件名必须是SPI接口的全名称,将SPI接口的实现类写入该配置文件中。 *`resources/META-INF/services/com.learn.spi.provider.service.ProviderLoggerService`* ``` com.learn.spi.provider.service.impl.Default01LoggerServiceImpl com.learn.spi.provider.service.impl.Default02LoggerServiceImpl ``` <br/> # 2. 创建SPI调用方 **1. 在调用方引入提供方的依赖** ```xml <dependencies> <dependency> <groupId>com.learn.example</groupId> <artifactId>com-learn-spi-provider</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> ``` **2. 根据需要,调用方也可以扩展SPI接口** *`com.learn.spi.consumer.service.impl.CustomLoggerServiceImpl`* ```java public class CustomLoggerServiceImpl implements ProviderLoggerService { @Override public void info(String message) { System.out.println(this.getClass().getSimpleName() + "--" + message); } } ``` **3. 在调用方创建`com.learn.spi.provider.service.ProviderLoggerService`配置文件** *`resources/META-INF/services/com.learn.spi.provider.service.ProviderLoggerService`* ``` com.learn.spi.consumer.service.impl.CustomLoggerServiceImpl ``` **4. 获取所有实现SPI接口的类** ```java public static void main(String[] args) { ServiceLoader<ProviderLoggerService> loader = ServiceLoader.load(ProviderLoggerService.class); loader.forEach(logger -> { logger.info("11"); }); } //CustomLoggerServiceImpl--11 //Default01LoggerServiceImpl--11 //Default02LoggerServiceImpl--11 ```