dubbo ExtensionLoader思路整理

1、入口:getExtensionLoader(Class<T> type)

校验:1、type非空  2、type被@SPI所注解(代表该接口为拓展接口)

所有拓展都缓存在静态 EXTENSION_LOADERS中,获取先从其中获取,如果未获取到,新建一个并加入其中


2、获取自适应的扩展(默认?)/ getAdaptiveExtension

某类型的自适应扩展对象缓存在cachedAdaptiveInstance, 如果还没有,则创建一个并加入缓存


3、创建自适应扩展 / createAdaptiveExtension

1、获取自适应扩展类 / getAdaptiveExtensionClass

2、获取扩展类 / getExtensionClasses

扩展类一般缓存在cachedClasses中,如果没有,加载拓展类并放入缓存

3、加载拓展类 / loadExtensionClasses

从三个地方加载拓展类 “META-INF/services/” “META-INF/dubbo/” “META-INF/dubbo/internal/” 

4、从文件中加载类 / loadFile

如果之前未加载过:

1、自适应拓展类(属于默认类,非拓展类:被@Adaptive注解的类)加载后缓存到cachedAdaptiveClass变量中

2、Wrapper包装类(带type构造器的类)加载后缓存到cachedWrappeClasses中

3、非自适应非包装类(属于拓展类),加载后缓存到cachedNames中,并作为返回结果(拓展类)返回,其中被@Activate注解的类缓存到cachedActivates中


4、注入拓展类 / injectExtension

经过前三步,拓展类和默认类已经都放入缓存中了,以ExtensionFactory为例,自适应类AdaptiveExtensionFactory缓存在cachedAdaptiveClass中,拓展类SpiExtensiionFactory和SpringExtensiionFactory都已缓存在cachedClasses和cachedNames中,下一步进行依赖注入(ExtensiionFactory不需注入):对 public的set方法进行注入,注入对象从objectFactory中获取需要注入的实体,objectFactory一般都是AdaptiveExtensionFactory, 而AdaptiveExtensionFactory又有SpiExtensiionFactory和SpringExtensiionFactory的引用,所以相当于从springCotext和SPI中注入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值