面试常问的dubbo的spi机制到底是什么?(上)(三)

pivoteic
发布于 2022-6-16 17:44
浏览
0收藏

 

接下来进去重载的loadDirectory方法。

面试常问的dubbo的spi机制到底是什么?(上)(三)-鸿蒙开发者社区

可以看出,fileName就是LoadingStrategy所指定的目录 +  接口的全限定名,这里就解释了为什么实现类需要写在类全限定名的文件里。其实就是从每个jar底指定的目录类全限定名为名称的文件,得到每个jar底下的文件的URL。然后遍历每个URL,加载类,我们进入loadResource方法来看看具体是怎么加载的。

面试常问的dubbo的spi机制到底是什么?(上)(三)-鸿蒙开发者社区

通过URL打开一个输入流,然后读取文件内容,取出每一行,以 = 进行分割(因为规定的是以键值对存的),键就是短名称,值就是实现类的名称,然后再进入loadClass方法,这个方法很重要,其实是对实现类进行一个分类,后面dubbo的特性实现的前提就是对这些实现类的分类操作。

面试常问的dubbo的spi机制到底是什么?(上)(三)-鸿蒙开发者社区面试常问的dubbo的spi机制到底是什么?(上)(三)-鸿蒙开发者社区

标红的两处是这个意思

 

如果你加了@Adaptive注解,那么就将赋值到cachedAdaptiveClass属性上。我们叫这个类为自适应类。什么是自适应,其实说白了这个类本身并没有实际的意义,它是根据你的入参动态来实现找到真正的实现类来完成调用。getAdaptiveExtension其实就是获取到这个自适应实现类对应的对象。

 

如果你的实现类是有一个该类型为参数的构造方法,那么就将这个实现类放到cachedWrapperClasses中,并且我们称这个类为包装类,什么叫包装,其实跟静态代理有点像,就是将目标对象进行代理,可以增强功能。

面试常问的dubbo的spi机制到底是什么?(上)(三)-鸿蒙开发者社区

这处标红的意思是判断是不是实现类是不是加了@Activate注解,是的话就将短名称和注解放入cachedActivates中,我们称这类实现类为自动激活的类,所谓的自动激活,就是可以根据你的入参,动态选择实现一批符合条件的实现类

面试常问的dubbo的spi机制到底是什么?(上)(三)-鸿蒙开发者社区

saveInExtensionClass就是将这个实现类放入extensionClasses中,该目录下的实现类就加载完成了。

 

接下来会继续循环,加载不同的目录底下,都会进行分类,并放到extensionClasses中。

 

当LoadingStrategy循环玩之后,最后将extensionClasses放入cachedClasses中,此时就完成了对于指定目录下实现类的加载和分类。

 

至此,实现类的加载和分类就完成了。

 

由于篇幅有限,dubbo的spi机制的其它各种特性和功能,比如依赖注入、自适应、自动包装等功能,我会再写一篇文章跟大家分享。

 

总结

 

本文最开始先介绍了什么是spi机制,然后分析了java的spi机制和spring的spi机制,最后我们进入本文的主题,dubbo的spi机制,我们讲了实现类的加载,加载实现类的时候会对实现类进行分类。由于篇幅有限,dubbo的spi机制的其它的特性功能我将在下篇文章继续分享,欢迎大家持续关注本公众号,谢谢大家。

 

文章转自公众号:三友的java日记

标签
已于2022-6-16 17:44:43修改
收藏
回复
举报
回复
    相关推荐