本文已参与周末学习计划,点击链接查看详情:juejin.cn/post/696572…
关于SPI
可以看之前写的博文,点击链接查看详情:juejin.cn/post/696771…
JDK中的SPI缺点
- jdk中spi是一次性把扩展点的实现全部实例化,如果扩展点的实现很多加载很耗时间
- 异常无法准确捕捉提示,当扩展点的的某个实现依赖的第三方库不存在,会导致类加载失败,报的错误是找不到扩展点,而不是扩展点加载失败,以及真正的原因
Dubbo对SPI的改进
- 增加了扩展点的默认实现
- 增加了AOP的实现
- 增加了缓存机制,提高了性能
- 配置文件内容改成为key=value形式,这样配置是为了改进上面所说的SPI的第二点缺点,为了将异常信息和配置对应起来
Dubbo中的SPI实现
- 在需要扩展点接口使用@SPI注解标识,以前使用的@Extension注解,不过后来因为含义广泛废弃,改用SPI
- dubbo使用ExtensionLoader.getExtensionLoader(Class type)获取扩展点实例,下面是具体实现
1 | typescript复制代码public static <T> ExtensionLoader<T> getExtensionLoader(Class<T> type) { |
- 返回指定名字的扩展点对象
1 | scss复制代码public T getExtension(String name) { |
- cachedInstances 实现
1 | typescript复制代码private final ConcurrentMap<String, Holder<Object>> cachedInstances = new ConcurrentHashMap<String, Holder<Object>>(); |
Dubbo中SPI具体使用
- 以protocol为例,缺省使用dubbo协议,dubbo支持默认spi扩展点
1 | kotlin复制代码@SPI("dubbo") |
- SPI对应的配置文件
1 | ini复制代码//com.alibaba.dubbo.rpc.Protocol文件里面的配置 |
- DubboProtocol
1 | csharp复制代码/* |
本文转载自: 掘金