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

以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. 小程序web-view的使用,跳转到外部链接~

    先说一下需求,要点击榜单,跳到我们的移动web的项目的榜单页,这个不是小程序的哦,就是网页版的. 榜单的html代码: <view class="nav" hover-cla ...

  2. p2p通信原理及实现

    1.简介 当今互联网到处存在着一些中间件(MIddleBoxes),如NAT和防火墙,导致两个(不在同一内网)中的客户端无法直接通信.这些问题即便是到了IPV6时代也会存在,因为即使不需要NAT,但还 ...

  3. vue设置公共常量

    Global.vue <template> </template> <script type="text/javascript"> const ...

  4. flutter的生命周期

    大致可以看成三个阶段 初始化(插入渲染树) 状态改变(在渲染树中存在) 销毁(从渲染树种移除) initState 当插入渲染树的时候调用,这个函数在生命周期中只调用一次.这里可以做一些初始化工作,比 ...

  5. bat命令编写大全

    bat命令编写大全 摘自:https://blog.csdn.net/haibo19981/article/details/52161653 2016年08月09日 12:26:31 爱睡觉的猫L 阅 ...

  6. 123456---com.twoapp.ErTongNongChangPinTu---儿童农场拼图

    com.twoapp.ErTongNongChangPinTu---儿童农场拼图

  7. PAT 甲级 1051 Pop Sequence (25 分)(模拟栈,较简单)

    1051 Pop Sequence (25 分)   Given a stack which can keep M numbers at most. Push N numbers in the ord ...

  8. 基于JAVA JWT 实现OATUH TOKEN验证

    什么是jwt? 最详细的是官网:https://jwt.io/ 这里以java的ssm框架为例,集成jwt. 1.pom.xml 导入jwt的包 <!-- jwt --> <!-- ...

  9. Java使用MyBatis的ScriptRunner执行SQL脚本

    脚本文件D:/test_transaction.sql: start transaction; drop table if exists testdb.test_transaction_table; ...

  10. 【Leetcode_easy】653. Two Sum IV - Input is a BST

    problem 653. Two Sum IV - Input is a BST 参考 1. Leetcode_easy_653. Two Sum IV - Input is a BST; 完