一、什么是SPI机制?
SPI(Service Provider Interface),是JDK内置的一种服务提供发现机制,SPI是一种动态替换发现的机制,一种解耦非常优秀的思想。
1.1 SPI的工作原理
SPI的工作原理:classpath路径下MATE-INF/services文件夹中,以接口的全限定名来命名文件,文件里面写该接口的实现。然后以资源加载的方式,读取文件的内容(接口实现的全限定名),再去加载类。
SPI可以很灵活的让接口和实现分离,让API提供者只提供接口,第三方来实现。
二、Dubbo的SPI机制
2.1 Dubbo的SPI机制
Dubbo的SPI机制的具体实现与使用的protocol相关,不同的协议找不同的实现类。
Dubbo的SPI源码流程如下:
与JDK的SPI不同的是,Dubbo的SPI机制寻找的文件有三个地方:
- META-INF/services/
- META-INF/dubbo/
- META-INF/dubbo/internal/
2.2 为什么Dubbo不用JDK的SPI,而是要自己实现?
JDK SPI的缺点:
- 会遍历所有实现并实例化,假设一个实现类初始化过程比较消耗资源且耗时,但是你的代码里面又用不上它,这就产生了资源的浪费,也无法准确引用。
- 没有使用缓存,每次load都要重载加载。
Dubbo SPI的优点:
- 给每个实现类配了个名字,通过名字去文件里面找到对应的实现类全限定名,然后加载实例化,
按需加载。 - 增加了
缓存存储实例,提高读取性能。 - 提供了对IOC和AOP等高级功能的支持,以实现更多类型的
扩展。