spi
spi 全称为“service provider interface”,是 java 提供的一种服务发现机制。例如 jdbc Driver 接口,具体实现类便是由具体的数据库厂商来实现。
java spi
它会读取 resource/META-INF/sevices 目录下的文件。文件名就是接口全路径名,内容为具体的实现类全路径名。通过下面类似代码载入服务:
java
ServiceLoader<xxx> serviceLoader = ServiceLoader.load(xxx.class);
for (xxx xx : serviceLoader) {
xx.xxxx();
}
好处不用多说,缺点是:
- 无法按需加载,造成资源浪费
- 扩展文件若比较多时,管理起来不是太友好
- 获取实现类的方式不够灵活,只能通过 Iterator 形式获取
spring spi
针对 java spi 存在的缺点,spring spi 进行了优化。其中它会读取 resource/META-INF/spring.factories 文件,文件内容可以为接口全路径名=接口实现全路径名,如果扩展比较多的话,只要换行照着对应格式添加即可。通过下面类似代码载入服务:
java
List<xxx> xxxServices = SpringFactoriesLoader.loadFactories(xxx.class, Thread.currentThread().getContextClassLoader());
可以看到,它改进了 java spi 中的:
- 扩展文件若比较多时,管理起来不是太友好
- 获取实现类的方式不够灵活,只能通过 Iterator 形式获取
这两点。但按需加载仍然没有解决。