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中注入