Dubbo SPI
2020-09-26 14:51:12 0 举报
Dubbo SPI
作者其他创作
大纲/内容
调用getExtensionClasses() 判断所有的扩展类是否已经被加载到缓存中,没有则加载所有的扩展类
getExtension,通过定义的名字从ExtensionLoader中找到对应实现类的实例
去Holder缓存cachedClasses 中找是否已经加载了所有扩展类的缓存Map
通过类名得到一个ExtensionLoader对象
返回实例,并且依赖注入(IOC)
/* *扩展容器,从缓存中获取,没有就新建空的holder一个加入缓存 */ final Holder<Object> holder = getOrCreateHolder(name); // instance 是我们需要的实例对象 Object instance = holder.get();
如果cachedAdaptiveClass为空则没有带有@Adaptive的实现类(即注解@Adaptive 在方法上)。就使用字节码技术(通过类加载器将字符串编译为class 类对象)自己构建一个自适应的class 类对象返回
遍历所有的包装类cachedWrapperClasses如果有包装类再包装一下(AOP)
没有就调用loadExtensionClasses() 方法去扫约定的三个目录,最终调用loadClass()逐行读取存入缓存中
返回
如果是Adaptive就记录在cachedAdaptiveClass
自适应Adaptive扩展入口
通过getExtensionClasses()得到所有扩展的类的缓存Map对象,再调用get(name)获得Class类对象
没有就调用createExtension 创建实例
ExtensionLoader<Compiler> extensionLoader = ExtensionLoader.getExtensionLoader(Compiler.class);Compiler jdk = extensionLoader.getExtension(\"jdk\");
没有就通过反射创建一个
如果标记了Activate,再记录在一个缓存里
判断cachedAdaptiveClass 有值是否有值
先去缓存cachedAdaptiveInstance 中找,没有就调用方法createAdaptiveExtension 创建Adaptive扩展
调用getAdaptiveExtensionClass 对象获取Adaptive扩展的类对象
getAdaptiveExtension,去查找自适应的扩展实例
最后拿到所有扩展类的缓存Map放入cachedClasses 缓存中并返回
如果是Wapper类就记录在一个Set对象cacheWrapperClass 中
先去缓存EXTENSION_INSTANCES 里看看有没有这个实例
先去缓存看看有没有这个实例
普通扩展入口
本次记录Dubbo版本为2.7.8-dev觉得不错请点个赞!还会陆续整理后续版本
遍历实例中所有的set方法,依赖注入(IOC) injectExtension(instance);
如果cachedAdaptiveClass 有值,说明标记在类上,直接返回即可。
收藏
收藏
0 条评论
下一页