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

以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. nginx 转发 header 数据丢失

    刚帮同事解决了个问题,记录一下,现象:放在header里面的数据,本地后台可以收到,集成可以收到,测试不行, 查看代码没问题,排除代码问题,比较集成和测试环境有何不同,发现集成环境是局域网访问,192 ...

  2. LeetCode 第 150 场周赛

    一.拼写单词(LeetCode-1160) 1.1 题目描述 1.2 解题思路 由于给定的chars,每个字母只能用一次,所以用大小为26的数组charsArray来表示a-z(例如charsArra ...

  3. SCHED_FIFO与SCHED_OTHER调度机制

    疑问 两个线程分别有不同的调度策略,一个SCHED_FIFO,一个SCHED_OTHER,按照之前的理解,SCHED_FIFO实时线程一定会占用CPU一直运行,导致SCHED_OTHER的普通线程得不 ...

  4. 性能监控 | MAT分析内存泄漏

    使用MAT分析内存泄漏(二)八周年重印版 - 知乎 .u-safeAreaInset-top { height: constant(safe-area-inset-top) !important; h ...

  5. PEP 442 -- Safe object finalization

    https://www.python.org/dev/peps/pep-0442/ PEP 442 -- Safe object finalization PEP: 442 Title: Safe o ...

  6. Googletest - Google Testing and Mocking Framework

    Googletest - Google Testing and Mocking Framework https://github.com/google/googletest

  7. osg::NodeVisitor osg3.4.0

    x:-89.4588 y:-12.1245 z:-11.7807x:-89.4588 y:-6.44823 z:-11.7807x:-89.2164 y:-9.07239 z:-11.811x:-89 ...

  8. 总结Lock和synchronized的区别

    1. Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现,Lock是代码层面的实现. 2. Lock可以选择性的获取锁,如果一段时间获取不到, ...

  9. Qt使用boost库

    1.在官网下载boost库 boost_1_70_0.zip 2.将你的Qt的工具目录(有gcc.exe)设置环境变量.(比如F:\Qt592\Tools\mingw530_32\bin) 3.在命令 ...

  10. java8中计算两个日期时间LocalDateTime的时间差,格式化成xx年yy月zz日aa时bb分cc秒

    原则上应该适用Period来计算,因为他是专门为这种需求设计的.当时他只能计算到两个时间差的,年月日 传入参数Period.between(LocalDate,LocalDate) 这里是计算两个Lo ...