相信在学习dubbo的同学肯定了解到一个机制 spi 机制,我们的java 中也有一个 spi机制,小白(我)就想了解下他们之间有什么不同。
Java SPI 机制
SPI(Service Provider Interface),Java提供的一套用来被第三方实现或扩展的API。
在Java当中他怎样实现呢
首先我们需要提供一个接口
然后来书写几个接口的实现类
然后我们去配置一个 META-INF/service/com.xxxxxx.xxx.xxx.UserService(这个是文件,以我们的接口类名来命名) 然后文件内容 书写上 我们的 接口实现的类名
然后我们进行测试 (根据我们的书写的类名加载实例化)
测试成功
到这里,感觉我们的java spi机制能帮我们一个大忙 ,他能帮我们调用我们的实现类,达到了解耦的效果。但是这种机制仍然有他不足的地方,通过debug进去我们一步一步分析就能发现,他是需要遍历所有的实现类并且实例化,不能按照我们所想要的实现类来实例化,当我们寻找所需的实现类的时候还需要在遍历中找到(大伙的想法估计也是想能直接拿到指定的实现类,同时也不想加载不用的实现类让资源浪费掉)。 带着问题来看dubbo 的 spi机制
Dubbo SPI 机制(他帮助我们解决了这个问题)
首先 Dubbo没有采用JAVA原生态的SPI,但是对他进行了加强,这些加强肯定针对Java SPI 上的一些不足进行了解决。
首先我们书写服务的接口,不过我们需要加上一个 SPI的注解
书写几个接口的实现类
重点来了 书写我们的配置文件
分三类
1. /META-INF/services/xxxxx 这个是用来兼容我们的JAVA spi的
2. /META-INF/dubbo/xxxxxx 这个是存放我们用户自定会议的 SPI配置文件
3. /META-INF/dubbo/internal/xxxxxx 这个是存放dubbo内部使用的spi配置文件
这里我用的是第二个 (写好配置文件)
不难发现 这里跟我们的 java spi的 配置文件有不同的地方 每个实现类名前对应了一个name,那他就应该是帮助我们拿到指定实现类的name
进行测试
进行测试确实如此
这里我们就能看出其实dubbo中的 spi 确实进行了增强,当然仅仅一个小测试还体现不出他的强大,在dubbo中底层当中(接口暴露,服务引用,服务调用)通过大家的学习更能体会到dubbo对SPI机制的使用。
(有问题希望大家指正,互帮互助,技术更上一层楼)