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

pivoteic
发布于 2022-6-14 16:37
浏览
0收藏

 

本文是接着 面试常问的dubbo的spi机制到底是什么?(上)来继续剖析dubbo spi机制源码,来看看dubbo的spi机制的其它特性功能。

 

前文回顾

一、实现类对象构造

二、自适应机制

三、自动激活

总结

 

前文回顾

 

前一篇文章主要是讲了什么是spi机制,spi机制在java、spring中的不同实现的分析,同时也剖析了一下dubbo spi机制的实现ExtensionLoader的实现中关于实现类加载以及实现类分类的源码。

 

一、实现类对象构造

 

看实现类对象构造过程之前,先看获取,因为获取不到才构造,也就是java中spi没有的功能,按需加载。


获取实现类对象的方法是getExtension方法,传入的name参数就是短名称,也就是spi文件的键,wrap是是否包装的意思,true的意思就是对你获取的目标对象进行包装(具体什么是包装,如何包装后面会讲),wrap默认是true

 

接下来我们就着重分析getExtension方法

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

前面两个if我说一下,

 

第一个if比较简单,就是简单的参数校验,name参数不能为空


第二个if判断name是不是字符串true,是的话就调用getDefaultExtension,getDefaultExtension这个方法通过名称也能看出来就是获取接口默认的实现,什么是默认实现?在 面试常问的dubbo的spi机制到底是什么?(上)一文中在实现类加载的时候我提到过,默认的实现就是@SPI注解中的名称对应的实现类。

 

前面两个if之后就是真正获取实现了。在获取之前,先根据你是否包装构建缓存的键值,如果没有包装,就会在短名称后加上 _origin  ,这主要是为了区分包不包装,然后进入getOrCreateHolder方法

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

里面其实就是通过缓存名称从cachedInstances获取一个Holder,获取不到就new一个Holder然后放到cachedInstances中,然后返回。Holder其实本身并没有什么意义,可以理解为一个空壳,里面放的才是真正最终返回的对象。

 

第一次,不用说Holder肯定没有,那么这个Holder肯定是刚new出来的。

跳出getOrCreateHolder方法,继续往下看。

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

从Holder中获取实现类,此时肯定是null,接下来就是synchronized,然后又是非空判断。这里其实是典型的单例模式中的双重检查机制,保证并发安全。其实从这里可以看出Holder的作用。这里是为了减少锁冲突的,因为一个实现类对象对应一个Holder对象,这样不同的实现类在创建的时候,由于Holder的不同,synchronized就不是同一个锁对象,这就起到了并发时候减少锁冲突的作用,从这可以看出dubbo设计的时候的细节是很到位的。

 

第一次都是null,接下来进入createExtension方法,构建对象的过程

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

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

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