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

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

 

先从实现类的缓存中获取到短名称对应的实现类,面试常问的dubbo的spi机制到底是什么?(上)一文中说到,实现类加载之后会放到内部的一个缓存中。

 

这个if条件判断一般肯定是false的,但是有些情况,就比如第一次构建对象抛出异常,此时第二次来构建这个对象,那么不用说肯定也会有问题,dubbo为了快速知道哪些实现类对象构造的时候会出异常,就在第一次构建对象抛异常的时候缓存了实现类的短名称到unacceptableExceptions中,当第二次来构建的时候,能够快速知道,抛出异常,减少资源的浪费。

 

接下来就会从extensionInstances中获取实例,这个实例是没有包装的实例,也就是说如果你获取的不带包装的实例,就是这个实例。我们看看这个实例是怎么构建出来的,这里我根据构建的不同阶段进行划分为以下几个步骤。

 

第一步:实例化对象

通过实例化策略InstantiationStrategy进行实例化,默认是通过无参构造器构造的。

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

第二步 :初始化前ExtensionPostProcessor 回调

调用 ExtensionPostProcessor的postProcessBeforeInitialization方法,ExtensionPostProcessor跟spring中的BeanPostProcessor有点像,就是对目标对象进行扩展的作用。

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

第三步 :依赖注入

接下来调用injectExtension方法,这个方法就是依赖注入的实现方法。

 

依赖注入:说白了就是dubbo会自动调用需要依赖注入的方法,传入相应的参数

 

哪些方法是需要依赖注入的方法?

dubbo约定 方法名以set开头,方法的参数只有一个,方法上没有加@DisableInject注解 ,方法是public的,符合这类的方法就是需要依赖注入的方法,dubbo在构建对象的时候会自动调用这些方法,传入相应的参数。

 

接下来进入源码

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

可以看出,先通过反射获取到所有的方法,然后遍历每个方法,进入两个if判断,这个判断就是判断是不是需要依赖注入的方法,也就是上面说的条件就在这个体现。

 

假设是需要依赖注入的方法,接下来看看如何获得需要被注入的对象,也就是方法的参数。

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

首先获取需要set的对象的class类型,就是方法的参数类型

 

然后通过getSetterProperty方法获取属性名,可以理解为bean的名称,

 

getSetterProperty就是方法去掉set然后第一个字母小写之后就是属性的名称,举个例子方法叫setUser,那么属性名就叫user,如果叫setUserName,属性名就叫userName,就这么简单。

 

最后就是根据属性名和参数类型通过 ExtensionInjector 获取需要被注入的对象。

 

ExtensionInjector 接口讲解

ExtensionInjector就是注入器,通过这个可以获取到被依赖注入的对象,这是个接口,有很多实现,这里是 AdaptiveExtensionInjector 实现类,也是通过spi机制获取的,ExtensionLoader构造的时候获取的。

 

下面列举了ExtensionInjector有的实现:

AdaptiveExtensionInjector:自适应的,本身没有实际的意义,就是遍历所有其它的ExtensionInjector实现来获取,一旦有一个获取到,就不会再调用下一个ExtensionInjector来获取的

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

SpiExtensionInjector:顾名思义,就是通过spi机制来获取,获取的是自适应的实现

SpringExtensionInjector:这个是通过spring容器获取实现,所以你通过dubbo的spi机制可以注入spring的bean

ScopeBeanExtensionInjector:通过dubbo内部的组件BeanFactory来获取的,BeanFactory是dubbo内部用来在一定范围的bean的容器,主要是为了对象的重复利用来的。

 

假设这里获取到了对象,那么接下来就是通过反射调用set方法,进行依赖注入,然后依赖注入就完成了。

 

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

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