Dubbo源码阅读之 ExtensionLoader
2017-06-27 21:29
507 查看
【 ExtensionLoader.java 】
@@@ 数据结构解读 = 初始化 + 接口的Class对象 + 实现类Class对象 + 适配类的CLass对象 + 适配类的实例 + 实现类的实例
1. class type 和 ExtensionLoader 是一一对应的关系。
======>>> 所有的 ExtensionLoader实例 都保存在静态变量 private static final ConcurrentMap<Class<?>, ExtensionLoader<?>> EXTENSION_LOADERS 中。
======>>> key是class type, 这样就可以通过class type获取 加载器(ExtensionLoader)实例。
======>>> ExtensionLoader实例中保存该 class type 的各种信息。
2. 字段 private final Class<?> type;
======>>> 该字段就是 class type ,作为初始化 ExtensionLoader 的参数。
3. 字段 private final Holder<Map<String, Class<?>>> cachedClasses = new Holder<Map<String,Class<?>>>();
======>>> 当前 ExtensionLoader 实例不是对应一个 class type 么,然后一个 class type 不是对应很多的实现类,该字段保存的就是这些实现类的Class对象。
======>>> key是类的 beanName,value是类的C lass对象。
======>>> 这个 beanName 是在配置文件中配置的,如果配置文件中没有配置就去取类的名称;一个Class可以对应多个beanName。
4. 字段 private volatile Class<?> cachedAdaptiveClass;
======>>> 这个是一个适配类,当class type的实现类有注解 @Adaptive,那么就讲该Class保存在该字段中;
======>>> 该CLass不会保出现在 3 中;
======>>> 如果从当前配置文件没有找到适配类的class,就会构建一个代理类;
======>>> 代理类实现了 class type,从参数URL中获取 extName。
======>>> 调用ExtensionLoader.getExtensionLoader(class type).getExtension(extName)获取class type的实例,然后调用实例中相应的方法。
5. 字段 private final Holder<Object> cachedAdaptiveInstance = new Holder<Object>();
======>>> 4中不是保存了一个适配类么,这里保存的就是适配类的实例;
6. 方法 public T getAdaptiveExtension();
======>>> 获取适配类的实例。
7 字段 private final ConcurrentMap<String, Holder<Object>> cachedInstances = new ConcurrentHashMap<String, Holder<Object>>();
======>>> 保存改 class type 实现类的各种实例。
======>>> key是类的 beanName,value是类的实例。
8. 方法 public T getExtension(String name);
======>>> 就是从 7 中的Map中获取,如果获取不到就会去 3 中 获取class对象, 然后初始化实例。
9. 字段 private String cachedDefaultName;
======>>> 如果接口(CLass Type)有注解 @SPI,并且指定了注解的值,该字段保存的就是注解的值。
10. 方法public T getDefaultExtension();
======>>> 获取默认的实例,其实就是调用方法 public T getExtension(String name);参数值就是9中的值。
11. 方法 private Map<String, Class<?>> loadExtensionClasses()
======>>> 方法6/8/10底层调的就是该方法。
======>>> 从文件中读取 class type 的各个实现类;
12. 在从初始完 class type 实例,调用 ExtentionFactory 来初设置实例中的属性。
@@@ 数据结构解读 = 初始化 + 接口的Class对象 + 实现类Class对象 + 适配类的CLass对象 + 适配类的实例 + 实现类的实例
1. class type 和 ExtensionLoader 是一一对应的关系。
======>>> 所有的 ExtensionLoader实例 都保存在静态变量 private static final ConcurrentMap<Class<?>, ExtensionLoader<?>> EXTENSION_LOADERS 中。
======>>> key是class type, 这样就可以通过class type获取 加载器(ExtensionLoader)实例。
======>>> ExtensionLoader实例中保存该 class type 的各种信息。
2. 字段 private final Class<?> type;
======>>> 该字段就是 class type ,作为初始化 ExtensionLoader 的参数。
3. 字段 private final Holder<Map<String, Class<?>>> cachedClasses = new Holder<Map<String,Class<?>>>();
======>>> 当前 ExtensionLoader 实例不是对应一个 class type 么,然后一个 class type 不是对应很多的实现类,该字段保存的就是这些实现类的Class对象。
======>>> key是类的 beanName,value是类的C lass对象。
======>>> 这个 beanName 是在配置文件中配置的,如果配置文件中没有配置就去取类的名称;一个Class可以对应多个beanName。
4. 字段 private volatile Class<?> cachedAdaptiveClass;
======>>> 这个是一个适配类,当class type的实现类有注解 @Adaptive,那么就讲该Class保存在该字段中;
======>>> 该CLass不会保出现在 3 中;
======>>> 如果从当前配置文件没有找到适配类的class,就会构建一个代理类;
======>>> 代理类实现了 class type,从参数URL中获取 extName。
======>>> 调用ExtensionLoader.getExtensionLoader(class type).getExtension(extName)获取class type的实例,然后调用实例中相应的方法。
5. 字段 private final Holder<Object> cachedAdaptiveInstance = new Holder<Object>();
======>>> 4中不是保存了一个适配类么,这里保存的就是适配类的实例;
6. 方法 public T getAdaptiveExtension();
======>>> 获取适配类的实例。
7 字段 private final ConcurrentMap<String, Holder<Object>> cachedInstances = new ConcurrentHashMap<String, Holder<Object>>();
======>>> 保存改 class type 实现类的各种实例。
======>>> key是类的 beanName,value是类的实例。
8. 方法 public T getExtension(String name);
======>>> 就是从 7 中的Map中获取,如果获取不到就会去 3 中 获取class对象, 然后初始化实例。
9. 字段 private String cachedDefaultName;
======>>> 如果接口(CLass Type)有注解 @SPI,并且指定了注解的值,该字段保存的就是注解的值。
10. 方法public T getDefaultExtension();
======>>> 获取默认的实例,其实就是调用方法 public T getExtension(String name);参数值就是9中的值。
11. 方法 private Map<String, Class<?>> loadExtensionClasses()
======>>> 方法6/8/10底层调的就是该方法。
======>>> 从文件中读取 class type 的各个实现类;
12. 在从初始完 class type 实例,调用 ExtentionFactory 来初设置实例中的属性。
相关文章推荐
- 带你阅读dubbo源码之通过SPI装载扩展(一)
- Dubbo源码阅读之 服务端和客户端处理链
- Dubbo 源码解析系列一 ExtensionLoader
- Dubbo 源码解读——自定义 Classloader 之 ExtensionLoader
- dubbo 源码学习笔记 (一) —— ExtensionLoader和URL
- dubbo源码阅读-remoting 设计模式
- Dubbo源码解析之扩展点(ExtensionLoader)篇
- dubbo源码解析(一): 扩展点加载(ExtensionLoader)
- Dubbo源码分析(三):ExtensionLoader
- Dubbo源码阅读体会(一)
- 带你阅读dubbo源码之自定义标签(二)
- 龙哥dubbo源码阅读实践-源码入口(第一章)
- 龙哥dubbo源码阅读实践-源码入口(第一章)
- dubbo源码分析-consumer端1-consumer代理生成
- 有没有必要阅读ANDROID源码
- Nginx源码阅读(ngx_worker_process_cycle)
- STL源码阅读(四)
- jetty源码阅读总结1
- 【SeaJS】【3】seajs.data相关的源码阅读
- linux-Tcp IP协议栈源码阅读笔记