Java中SPI机制简单演示
写一个SpiService接口
public interface SpiService {void run();}
写两个实现类,注意:实现类可以跨包
@Slf4j
public class SpiServiceImpl1 implements SpiService {@Overridepublic void run() {log.warn("SpiServiceImpl1");}}
@Slf4j
public class SpiServiceImpl2 implements SpiService {@Overridepublic void run() {log.warn("SpiServiceImpl2");}}
第一种,交给Spring管理
- 在src/main/resources目录下创建META-INF文件夹
- 在META-INF文件夹下spring文件夹
- 在spring文件夹下创建org.springframework.boot.autoconfigure.AutoConfiguration.imports文件
- 文件中填写实现类的全限定名
测试
@Autowiredprivate ApplicationContext applicationContext;@Testpublic void test2(){SpiService spiService = SpringUtil.getBean(SpiServiceImpl2.class);log.warn("spiService:{}", spiService);spiService.run();}@Testpublic void test5(){SpiServiceImpl2 spiServiceImpl2 = applicationContext.getBean(SpiServiceImpl2.class);spiServiceImpl2.run();}
第二种,用ServiceLoader.load装载
- 在src/main/resources目录下创建META-INF文件夹
- 在META-INF文件夹下services文件夹
- 在spring文件夹下创建接口的全限定名文件
- 文件中填写实现类的全限定名
测试
@Testpublic void test3() {// ServiceLoaderUtil是hutool工具包提供的工具SpiService spiService = ServiceLoaderUtil.loadFirstAvailable(SpiService.class);spiService.run();}@Testpublic void test4(){// ServiceLoader是java自带的工具ServiceLoader<SpiService> spiServices = ServiceLoader.load(SpiService.class);for (SpiService spiService : spiServices) {spiService.run();}}