dubbo SPI流程图
2023-04-27 15:51:28 5 举报
基于2.6.x dubbo版本的SPI流程
作者其他创作
大纲/内容
处理wrapper
校验set的属性类上是否有@SPI
放入cacheWrapperClesses中
SpringExtensionFactory(Spring容器中找实例)
查看缓存Extension_Instance查询
为代理生成代码,代码中需要使用URL参数,需要set方法上使用@adapter注解
getExtension(name)通过extensionLoader根据name找一个实例
自适应扩展点注解
缓存不存在,主动生成扩展类
一个接口在配置文件中智能有一个adaptive注释的类,获取接口的时候会先走到这个adaptive的方法中
实现了filter
放入cacheActivate中
injectExtension()扩展类实现注入
不为null
调用injectExtension()。 注入生成instance
逐行遍历文件内容
返回Instance对象
根据type(接口名称)获取扩展点加载器
放入cacheAdaptiveClesses中
AdaptiveExtensionFactory(使用@adaptive注解)
objectFactory.getExtension(类型,属性名)获取扩展点对象
SPIExtensionFactory(dubbo自带的扩展点加载)
有
针对@SPI接口,通过类名获取一个扩展点加载器 ExtensionLoader,没有就new一个新的
createAdaptiveExtension()生成代理扩展类
没有wrapper的场景
cacheAdaptiveClassess中查询缓存
主要针对自定义类。遍历set方法,找到set属性字段,属性类型。
普通扩展入口
是否有set方法
使用编译器编译代码,得到Class对象
@Activate
这个就是去Spring容器中去找这个实例
不存在
ExtensionFactory:扩展工场
SPI
Wrapper
这个就是实现了AOP
注入set方法
loadResource()。加载文件中的内容
调用injectExtension()生成wrapper实例对象
get(name)获得具体的实例对象
loader.getAdaptiveExtension()获得代理扩展
注释到类上
校验cacheWrapperClasser中是否为null
@Adaptive
类类型
没有
生成,编译一个Adaptive代理类,代理类通过URL中的参数实现动态代理模式
注释到方法上
存在
0 条评论
回复 删除
下一页