这篇排版有问题 后面修改....****

以ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();为例

-->ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension()
-->new ExtensionLoader<T>(Protocol.class)
-->this.type = Protocol.class
-->objectFactory = ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension()
-->new ExtensionLoader<T>(ExtensionFactory.class)
-->this.type = ExtensionFactory.class
-->objectFactory = null
-->getAdaptiveExtension()
-->instance = createAdaptiveExtension
-->AdaptiveExtensionFactory.class = getAdaptiveExtensionClass
-->getExtensionClasses
-->Map<String, Class<?>> classes = loadExtensionClasses //加载扩展类
-->loadDirectory //以此加载当个默认目录下的
com.alibaba.dubbo.common.extension.ExtensionFactory文件中的扩展类
-->loadResource
-->loadClass
文件中AdaptiveExtensionFactory类有@Adaptive注解
cachedAdaptiveClass = AdaptiveExtensionFactory.class
然后加载SpiExtensionFactory,SpringExtensionFactory, 并放入extensionClasses(Map)
cachedNames.put(SpiExtensionFactory.class, spi)
cachedNames.put(SpringExtensionFactory.class, spring)
-->cachedClasses.set(classes )
此时cachedClasses中有了SpiExtensionFactory.class和SpringExtensionFactory.class
-->由于AdaptiveExtensionFactory.class给cachedAdaptiveClass赋值了,这个返回cachedAdaptiveClass
-->injectExtension(AdaptiveExtensionFactory.class.newInstance)
**//IOC 通过set方法给属性赋值, 这里调用了构造方法,将cachedClasses中的值添加到factories中** **//这里就是AdaptiveExtensionFactory中factories值得由来**
-->cachedAdaptiveInstance.set(instance) //将AdaptiveExtensionFactory对象保存起来
-->EXTENSION_LOADERS.put(ExtensionFactory.class, 扩展器)
**//注意,这里将ExtensionFactory的扩展器保存在EXTENSION_LOADERS中了,这是个static变量**
//以上都是ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension()的步骤
-->getAdaptiveExtension
-->createAdaptiveExtension
-->Protocol$Adaptive = getAdaptiveExtensionClass
-->getExtensionClasses
这里步骤与加载ExtensionFactory一样,加载com.alibaba.dubbo.rpc.Protocol下的扩展类
由于该文件下没有@Adaptive修饰的类,执行createAdaptiveExtensionClass方法生成动态类
-->createAdaptiveExtensionClass
-->createAdaptiveExtensionClassCode //创建动态类代码
-->AdaptiveComplier = ExtensionLoader.getExtensionLoader(Compiler.class)
.getAdaptiveExtension();
-->new ExtensionLoader<T>(Compiler.class)
-->this.type = Compiler.class;
-->objectFactory = ExtensionLoader.getExtensionLoader(ExtensionFactory.class)
.getAdaptiveExtension());
-->直接从EXTENSION_LOADERS中获取ExtensionFactory的扩展器
-->getAdaptiveExtension
-->createAdaptiveExtension
-->getExtensionClasses
//Compiler文件中AdaptiveCompiler类被@Adaptive修饰,直接返回
-->AdaptiveCompiler.compile
-->AbstractCompiler.compile
**//先使用Class.forName去加载该class文件**
**//如果没有调用JavassistCompiler.doCompile 使用javassist去编译(cls.toClass)的到**
**// 到这里从获取到扩展类到编译得到Class文件就完成了**
-->EXTENSION_LOADERS.put(Compiler.class, 扩展器)
-->cachedAdaptiveInstance.set(Protocol$Adaptive);
-->EXTENSION_LOADERS.put(Protocol.class, 扩展器)

下面是大致得过程图

Dubbo#编译动态扩展类的更多相关文章

  1. Alibaba Java诊断工具Arthas查看Dubbo动态代理类

    原创/朱季谦 阅读Dubbo源码过程中,会发现,Dubbo消费端在做远程调用时,默认通过 Javassist 框架为服务接口生成动态代理类,接着再去调用代理类实现远程接口调用.在阅读这部分源码时,最后 ...

  2. Dubbo源码解析之SPI(一):扩展类的加载过程

    Dubbo是一款开源的.高性能且轻量级的Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用.智能容错和负载均衡,以及服务自动注册和发现. Dubbo最早是阿里公司内部的RPC框架,于 ...

  3. PHP7 学习笔记(九)phpsize动态编译openssl扩展 (微信公众平台)

    先吐槽,微信公众平台授权出问题了,尽然访问不了 一.问题描述: 使用PHP中的库函数file_get_contents时出现Unable to find the wrapper "https ...

  4. Dubbo中SPI扩展机制解析

    dubbo的SPI机制类似与Java的SPI,Java的SPI会一次性的实例化所有扩展点的实现,有点显得浪费资源. dubbo的扩展机制可以方便的获取某一个想要的扩展实现,每个实现都有自己的name, ...

  5. 这个Dubbo注册中心扩展,有点意思!

    今天想和大家聊聊Dubbo源码中实现的一个注册中心扩展.它很特殊,也帮我解决了一个困扰已久的问题,刚刚在生产中用了,效果很好,迫不及待想分享给大家. Dubbo的扩展性非常灵活,可以无侵入源码加载自定 ...

  6. Java+7入门经典 - 6 扩展类与继承 Part 1/2

    第6章 扩展类与继承 面向对象编程的一个重要特性: 允许基于已定义的类创建新的类; 6.1 使用已有的类 派生 derivation, 派生类 derived class, 直接子类 direct s ...

  7. 理解性能的奥秘——应用程序中慢,SSMS中快(6)——SQL Server如何编译动态SQL

    本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(5)--案例:如何应对参数嗅探 我们抛开参数嗅探的话题,回到了本系列的最 ...

  8. 使用Dubbo的SPI扩展机制实现自定义LoadBalance——方法二 不改源码添加META-INF/dubbo元数据

    一.官网提供的方法 参考官网 http://dubbo.apache.org/zh-cn/docs/dev/impls/load-balance.html 二.方法总结 在工程中创建类并实现LoadB ...

  9. [ios]objective-c中Category类别(扩展类)专题总结

    本文转载至 http://yul100887.blog.163.com/blog/static/20033613520126333344127/   objective-c类别的作用?通过类别的方式, ...

随机推荐

  1. 实现Runnable接口方式

    package com.roocon.thread.t2; public class Demo2 implements Runnable { @Override public void run() { ...

  2. elasticsearch工作笔记002---Centos7.3安装最新版elasticsearch-7.0.0-beta1-x86_64.rpm单机版安装

    新版本es安装问题: https://blog.csdn.net/lidew521/article/details/88091539

  3. layui跨域问题的解决

      跨域问题的解决 由于浏览器存在同源策略,所以如果 layui(里面含图标字体文件)所在的地址与你当前的页面地址不在同一个域下,即会出现图标跨域问题.所以要么你就把 layui 与网站放在同一服务器 ...

  4. Uploadifive 上传'fileType'格式如何限制?

    Uploadifive: 'fileType':[ "application/pdf", "application/msword", "applica ...

  5. OpenJudge计算概论-取石子游戏

    OpenJudge计算概论-取石子游戏[函数递归练习] /*====================================================================== ...

  6. opencv常见示例

    1.批量转换灰度图并保存 #include <iostream> #include <opencv2/opencv.hpp> #include <string> u ...

  7. <HTML/CSS>BFC原理剖析

    本文讲了BFC的概念是什么: BFC的约束规则:咋样才能触发生成新的BFC:BFC在布局中的应用:防止margin重叠(塌陷,以最大的为准): 清除内部浮动:自适应两(多)栏布局. 1. BFC是什么 ...

  8. 微信小程序测试检查点

    1.权限测试 需要检查以下几种情况下微信用户访问的权限1)未授权微信登录小程序未授权时,一般使用一些业务功能的时候,都会弹出提醒:先授权再操作对应功能.或在提交数据到后台的时候,会提示补充相关身份信息 ...

  9. CentOS7下搭建zabbix监控(一)——Zabbix监控端配置

    zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案.zabbix 能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快速定位 ...

  10. LeetCode_101. Symmetric Tree

    101. Symmetric Tree Easy Given a binary tree, check whether it is a mirror of itself (ie, symmetric ...