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 条评论
 下一页
  
   
   
   
   
  
  
  
  
  
  
  
  
 