Dubbo源码阅读三:Dubbo SPI机制二

第1节 ExtensionLoader核心方法

方法名

修饰关键字

作用

ExtensionLoader

private

私有构造函数,只被getExtensionLoader()方法调用,保证加载器对象是单例的

loadLoadingStrategies

private static

利用Java SPI机制创建LoadingStragegy接口的所有实现类的对象数组

withExtensionAnnation

private static

用于检查接口是否带有@SPI注解

findClassLoader

private static

获取class加载器

getExtensionLoader

public static

获取SPI接口的加载器对象,如果对象不存在构建新对象,并存在EXTENSION_LOADS静态表中

getDefaultExtension

public

获取默认的SPI接口的实现对象

getExtension

public

按照名字获取SPI接口的实现对象

getSupportedExtensionInstances

public

获取写入SPI配置文件的所有的SPI接口的实现对象

getAdaptiveExtension

public

获取objectFactory实现对象,会触发调用createAdaptiveExtension()方法

getAdaptiveExtensionClass

private

获取objectFactory的实现类

createAdaptiveExtension

private

创建objectFactory实现对象

getExtensionClasses

private

获取SPI接口的实现类的映射表,会触发调用loadExtensionClassess()方法

loadExtensionClasses

private

根据SPI配置加载实现类

loadDirectory

private

从指定的META-INF目录下加载实现类

loadResource

private

从指定的jar包内部SPI配置文件加载实现类

loadClass

private

加载SPI接口的实现类

第2节 getExtensionLoader()的调用过程

方法的详细调用过程如下图

第3节 getExtensionClasses()的调用过程

方法的详细调用过程如下图

 

 

执行完getExtensionClasses()方法之后,ExtensionLoader<T>对象的状态如下

type=T.class

objectFactory=null

cachedAdaptiveClass=null或者AdaptiveExtensionFactory.class

cachedDefaultName=null或者@SPI注解指定的value值

cachedNames:

ImplClass1.class name1

ImplClass2.class name2

等等

cachedClasses:

name1 ImplClass1.class

name2 ImplClass2.class

等等

第4节 getAdaptiveExtension()的调用过程

方法的详细调用过程如下图

执行完成之后,ExtensionLoader<ExtensionFactory>对象的状态如下

type=ExtensionFactory.class

objectFactory=null

cachedAdaptiveClass=AdaptiveExtensionFactory.class

cachedAdaptiveInstance持有AdaptiveExtensionFactory对象

cachedDefaultName=null,(ExtensionFactory接口定义的@SPI注解没有指定value值)

cachedNames:

SpringExtensionFactory.class spring

SpiExtensionFactory.class spi

cachedClasses:

spring SpringExtensionFactory.class

spi SpiExtensionFactory.class

第5节 getDefaultExtension()的调用过程

方法的详细调用过程如下图

 

主要执行过程如下:

1)首先调用getExtensionClasses(),确保已加载实现类

2)通过反射创建instace

3)IOC注入依赖

4)编排AOP执行顺序

5)执行初始化

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值