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