dubbo-spi v2.7.10
2021-07-06 15:27:31 0 举报
dubbo spi
作者其他创作
大纲/内容
先在cachedInstances查看是否存在,有则返回
loadExtensionClasses
默认通过javasist将code编译成class
如果是Wrapper类,缓存(即拥有入参为type的构造函数)
如果“普通实现类名”不为空,返回自适应实现
初始化ExtensionClasses
指定name获取接口指定实现类实例
依次遍历目录:\"META-INF/dubbo/internal\"\"META-INF/dubbo/\"\"META-INF/services/\"
1. 接口至少有一个标记@Adaptive注解的方法
如:SpiExtensionFactory
否则创建\"自适应\"实例
type=注入属性类型class
遍历set方法依赖注入
是否缓存了AdaptiveClass
通过接口class得到ExtensionLoader
type=目标接口class
缓存中是否有\"自适应\"实例
没有,创建\"自适应\"实例
获取自适应扩展实例class
获取属性名
如果有缓存包装类则再包装一下。如果包装类标注@Wrapper则根据matches和mismatches过滤下目标name。(包装类须有入参为接口class的构造函数)
如果是普通类则缓存在两个map里。如果标注有@Activate再记录在一个缓存里
2. 该方法参数列表必须含有org.apache.dubbo.common.URL或者参数含有URL的getter方法
私有构造函数
获取\"自适应\"扩展实例
有一个factory能get到实现即返回
反射调用set方法注入
获取上一步cachedAdaptiveClass
若已缓存\"自适应实例\"则返回
默认2个SpiExtensionFactorySpringExtensionFactory
有两个前提条件须满足,否则生成code报错!
反射创建实例(无参构造)
查看缓存中是否存在
获取ExtensionFactory接口的ExtensionLoader
loadDirectory加载文件名是type接口全限定名的内部的键值对
获取set方法参数类型
adaptiveExtensionFactory根据类型和属性名获取实现类实例
没有则通过反射newInstance创建
没有,调用createExtension创建
loadClass加载当前目录的class
遍历所有ExtensionFactory实现
getExtensionClasses
初始化objectFactory
如果class标注有@Adaptive,缓存
type=ExtensionFactory
取name对应实现类的class
AdaptiveExtensionFactory
0 条评论
下一页