初识SPI

前言

先不深究机制及原理,仅是认识SPI是如何生效的。

  1. 定义1个接口
1
2
3
4
5
6
/**
* @author cuishiying
* @date 2021-01-22
*/
public interface IAlgorithm {
}
  1. 实现类
1
2
3
4
5
6
/**
* @author cuishiying
* @date 2021-01-22
*/
public class LoopAlgorithm implements IAlgorithm {
}
1
2
3
4
5
6
/**
* @author cuishiying
* @date 2021-01-22
*/
public class RandomAlgorithm implements IAlgorithm {
}
  1. 在resources下创建目录 META-INF/services/, 并在目录下新建全路径接口文件
1
2
3
4
5
➜  services pwd
/Users/cuishiying/work/examples/demo-java/src/main/resources/META-INF/services
➜ services tree
.
└── com.example.clz.IAlgorithm
  1. 在接口中定义实现类
1
2
com.example.clz.LoopAlgorithm
com.example.clz.RandomAlgorithm
  1. 测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Slf4j
public class Main {

/**
* 15:17:12.924 [main] INFO com.example.clz.Main - 接口实现类: com.example.clz.LoopAlgorithm
* 15:17:12.931 [main] INFO com.example.clz.Main - 接口实现类: com.example.clz.RandomAlgorithm
*/
public static void main(String[] args) {
ServiceLoader<IAlgorithm> serviceLoader = ServiceLoader.load(IAlgorithm.class);
for (IAlgorithm algorithm : serviceLoader){
log.info("接口实现类: {}", algorithm.getClass().getName());
}
}
}