Dubbo SPI

2021-08-30  本文已影响0人  晚歌歌

Java SPI

SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。

原因

面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。为了实现在模块装配的时候不用在程序里动态指明,这就需要一种服务发现机制。java spi就是提供这样的一个机制:为某个接口寻找服务实现的机制。这有点类似IOC的思想,将装配的控制权移到了程序之外。

API SPI

实现

原理

Class.forName反射加载并实例化进缓存

缺点

Java SPI 在查找扩展实现类的时候遍历 SPI 的配置文件并且将实现类全部实例化,无法按需加载

Dubbo SPI

image.png

优点

Dubbo 的扩展点加载是基于JDK 标准的 SPI 扩展点发现机制增强而来的,Dubbo 改进了 JDK 标准的 SPI 的以下问题:

配置文件

文件名同样是接口全限定名,而内容是k-v形式,比如localCache=com.spi.cache.LocalCache,同样这样的方式实现按需加载

注解

@SPI注解(注解在类上)

标识了接口是一个扩展点,属性 value 用来指定默认适配扩展点的名称。

@Adaptive注解(注解在类型和方法上)

注解在类上 , 这个类就是缺省的适配扩展;注解在扩展点 @SPI 的方法上时 , dubbo 动态的生成一个这个扩展点的适配扩展类

@Activate注解 - 自适应扩展(注解在类型和方法上)

注解在扩展点的实现类上 ,表示了一个扩展类被获取到的的条件,根据 @Activate 中的 group 、 value 属性来过滤,

文件目录

AOP

https://www.cnblogs.com/UYGHYTYH/p/13028591.html

image.png

利用符合构造函数要求的装饰者模式包装类来包装实现类

IOC

一个扩展点可以通过 setter 注入其它扩展点

原理

ExtensionLoader类似 Java SPI 中 ServiceLoader

使用:ExtensionLoader.getExtensionLoader(Cache.class).getExtension()或其他方法

上一篇 下一篇

猜你喜欢

热点阅读