前言
在开源的框架、项目中,会有很多地方使用到了 JavaSPI 的机制,例如数据库驱动、Dubbo、日志框架等等,这种可扩展的编程机制,不仅方便服务的扩展,还可以实现插拔式的替换组件。
什么是 JavaSPI?
SPI 的全名为 Service Provider Interface,英文不错的童鞋可以去官方看一下(https://docs.oracle.com/javase/tutorial/sound/SPI-intro.html)),用白话文去说就是(基于接口编程+策略模式+配置文件),其实这种机制,在某种层度上类似于 java.util.Collections 中的 sort 等方法,我们传入的除了数据集合,还有实现了 Comparator 接口的具体排序规则方法,这种情况下就实现了针对接口定制化开发实现,并动态可插拔的思想。但是不同的是,JavaSPI 规定了在提供了服务接口的实现之后,在静态资源目录下创建 services 目录,(META-INF/services/),其中 services 目录里同时创建一个以服务接口命名的文件,文件内容为服务实现类的全路径。