如果读者没有了解过SPI,建议先看一下java spi
https://www.jianshu.com/p/7c2f50561546
什么是Dubbo的SPI
SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。Dubbo通过SPI来加载所有的组件。但是Dubbo没有用原生的java spi而是增强了spi的功能。
Java SPI 与 Dubbo SPI的区别
Java SPI的约定:
- 在META-INF/services/目录中创建以接口全限定名命名的文件该文件内容为Api具体实现类的全限定名
- 使用ServiceLoader类动态加载META-INF中的实现类
- 如SPI的实现类为Jar则需要放在主程序classPath中
- Api具体实现类必须有一个不带参数的构造方法
Dubbo SPI的约定:
区别一: Java SPI 必须在META-INF/services下创建接口命令的全类名文件。而Dubbo SPI则可以在META-INF/dubbo、META-INF/dubbo/internal、META-INF/services 文件下都可以创建以接口全类名命名的文件
区别二:文件中的内容 java spi 中的内容就是实现类的全类名的路径,而dubbo spi则是以 key-value的形式进行存储,key表示一个名字 value表示实现类的全路径。