Dubbo源码阅读之 ExtensionLoader

【 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 来初设置实例中的属性。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值