Dubbo——ExtensionFactory的实现原理

本文深入探讨了Dubbo框架中的扩展机制,特别是ExtensionFactory的实现原理。通过RegistryFactory工厂类和ExtensionLoader类,动态查找并初始化注册中心客户端,展示了AdaptiveExtensionFactory如何作为默认实现,以及Dubbo与Spring容器的交互过程。

ExtensionFactory的实现原理

RegistryFactory工厂类通过@Adaptive({"protocol"})注解动态查找注册中心实现,根据URL中的protocol参数动态选择对应的注册中心工厂,并初始化具体的注册中心客户端。而实现这个特性的ExtensionLoader类,本身又是通过工厂方法ExtensionFactory创建的,并且这个工厂接口上也有SPI注解,还有多个实现。

在这里插入图片描述

AdaptiveExtensionFactory这个实现类工厂上有@Adaptive注解。因此,AdaptiveExtensionFactory会作为一开始的默认实现。
在这里插入图片描述

工厂类之间的关系如下:
在这里插入图片描述
可以看到,除了可以从Dubbo SPI管理的容器中获取扩展点实例,还可以从Spring容器中获取。

Dubbo和Spring容器之间是如何打通的呢?

看SpringExtensionFactory的实现,该工厂提供了保存Spring上下文的静态方法,可以把Spring上下文保存到Set集合中。当调用getExtension获取扩展类时,会遍历Set集合中所有的Spring上下文,先根据名字依次从每个Spring容器中进行匹配,如果根据名字没匹配到,则根据类型去匹配,如果还没有匹配到则返回null:

在这里插入图片描述

再看SPIExtensionFactory,主要就是获取扩展点接口对应的Adaptive实现类。例如:某个扩展点实现类ClassA上有@Adaptive注解,则调用SpiExtensionFactory#getExtesion会直接返回ClassA实例:

在这里插入图片描述

经过一番流转,最终还是回到了默认实现AdaptiveExtensionFactory上,因为该工厂上有@Adaptive注解。这个默认工厂在构造方法中就获取了所有扩展类工厂并缓存起来,包括SpiExtensionFactory和SpringExtensionFactory。
在这里插入图片描述
被AdaptiveExtensionFactory缓存的工厂会通过TreeSet进行排序,SPI排在前面,Spring排在后面。当调用getExtension方法时,会遍历所有的工厂,先从SPI容器中获取扩展类,如果没找到,则再从Spring容器中查找。

可以理解为,AdaptiveExtensionFactory持有了所有的具体工厂实现,它的getExtesion方法中只是遍历了它持有的所有工厂,最终还是调动SPI或Spring工厂实现的getExtesion方法。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值