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

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

  1. -->ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension()
  2. -->new ExtensionLoader<T>(Protocol.class)
  3. -->this.type = Protocol.class
  4. -->objectFactory = ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension()
  5. -->new ExtensionLoader<T>(ExtensionFactory.class)
  6. -->this.type = ExtensionFactory.class
  7. -->objectFactory = null
  8. -->getAdaptiveExtension()
  9. -->instance = createAdaptiveExtension
  10. -->AdaptiveExtensionFactory.class = getAdaptiveExtensionClass
  11. -->getExtensionClasses
  12. -->Map<String, Class<?>> classes = loadExtensionClasses //加载扩展类
  13. -->loadDirectory //以此加载当个默认目录下的
  14. com.alibaba.dubbo.common.extension.ExtensionFactory文件中的扩展类
  15. -->loadResource
  16. -->loadClass
  17. 文件中AdaptiveExtensionFactory类有@Adaptive注解
  18. cachedAdaptiveClass = AdaptiveExtensionFactory.class
  19. 然后加载SpiExtensionFactorySpringExtensionFactory, 并放入extensionClasses(Map)
  20. cachedNames.put(SpiExtensionFactory.class, spi)
  21. cachedNames.put(SpringExtensionFactory.class, spring)
  22. -->cachedClasses.set(classes )
  23. 此时cachedClasses中有了SpiExtensionFactory.classSpringExtensionFactory.class
  24. -->由于AdaptiveExtensionFactory.classcachedAdaptiveClass赋值了,这个返回cachedAdaptiveClass
  25. -->injectExtension(AdaptiveExtensionFactory.class.newInstance)
  26. **//IOC 通过set方法给属性赋值, 这里调用了构造方法,将cachedClasses中的值添加到factories中**
  27. **//这里就是AdaptiveExtensionFactory中factories值得由来**
  28. -->cachedAdaptiveInstance.set(instance) //将AdaptiveExtensionFactory对象保存起来
  29. -->EXTENSION_LOADERS.put(ExtensionFactory.class, 扩展器)
  30. **//注意,这里将ExtensionFactory的扩展器保存在EXTENSION_LOADERS中了,这是个static变量**
  31. //以上都是ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension()的步骤
  32. -->getAdaptiveExtension
  33. -->createAdaptiveExtension
  34. -->Protocol$Adaptive = getAdaptiveExtensionClass
  35. -->getExtensionClasses
  36. 这里步骤与加载ExtensionFactory一样,加载com.alibaba.dubbo.rpc.Protocol下的扩展类
  37. 由于该文件下没有@Adaptive修饰的类,执行createAdaptiveExtensionClass方法生成动态类
  38. -->createAdaptiveExtensionClass
  39. -->createAdaptiveExtensionClassCode //创建动态类代码
  40. -->AdaptiveComplier = ExtensionLoader.getExtensionLoader(Compiler.class)
  41. .getAdaptiveExtension();
  42. -->new ExtensionLoader<T>(Compiler.class)
  43. -->this.type = Compiler.class;
  44. -->objectFactory = ExtensionLoader.getExtensionLoader(ExtensionFactory.class)
  45. .getAdaptiveExtension());
  46. -->直接从EXTENSION_LOADERS中获取ExtensionFactory的扩展器
  47. -->getAdaptiveExtension
  48. -->createAdaptiveExtension
  49. -->getExtensionClasses
  50. //Compiler文件中AdaptiveCompiler类被@Adaptive修饰,直接返回
  51. -->AdaptiveCompiler.compile
  52. -->AbstractCompiler.compile
  53. **//先使用Class.forName去加载该class文件**
  54. **//如果没有调用JavassistCompiler.doCompile 使用javassist去编译(cls.toClass)的到**
  55. **// 到这里从获取到扩展类到编译得到Class文件就完成了**
  56. -->EXTENSION_LOADERS.put(Compiler.class, 扩展器)
  57. -->cachedAdaptiveInstance.set(Protocol$Adaptive);
  58. -->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. ICEM-圆锥的一种画法(2D转3D)

    原视频下载地址:https://pan.baidu.com/s/1jIOEelo  密码: btap

  2. BZOJ3262陌上花开

    三维偏序的模板. 当然各种树套树都可以搞,这里用CDQ分治弄一下. 首先利用排序使第一维有序,然后利用cdq函数开始执行类似归并排序的操作,由于左区间的第一维一定小于右区间的第一维,所以我们在归并过程 ...

  3. 深入理解JVM虚拟机5:虚拟机字节码执行引擎

    虚拟机字节码执行引擎   转自https://juejin.im/post/5abc97ff518825556a727e66 所谓的「虚拟机字节码执行引擎」其实就是 JVM 根据 Class 文件中给 ...

  4. GC类型以及不同类型GC的搭配

    jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代) jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel ...

  5. Radix Heap ---Dijkstra算法的优化 BY Gremount

    Radix Heap 算法是在Dijkstra的Dial实现的基础上,通过减少对桶的使用,来优化算法的时间复杂度: Dial 时间复杂度是O(m+nC)     -------C是最长的链路 Radi ...

  6. spring boot + vue 前后分离实现登录功能(一)

    使用webpack 打包初始化项目 vue init webpack book-vue 进入工程目录 cd hello-vue 安装 vue-router npm install vue-router ...

  7. linux服务器下安装phpstudy 如何命令行进入mysql

    配置了phpstudy 可是进不去mysql 老是报-bash: mysqld: command not found 解决方法:在linux环境下运行:ln -s /phpstudy/mysql/bi ...

  8. 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_12-SpringSecurityOauth2研究-JWT研究-生成私钥和公钥

    3.6.3 JWT入门 Spring Security 提供对JWT的支持,本节我们使用Spring Security 提供的JwtHelper来创建JWT令牌,校验JWT令牌 等操作. 3.6.3. ...

  9. 源码安装LNMP

    需要准备的安装包以及下载地址(只是一个大概地址,版本和下载方式需要自行选择): Nginx http://nginx.org/en/download.html nginx主程序包 MySQL http ...

  10. Django之中间件、缓存以及信号

    Django之中间件 中间件执行流程 我们从浏览器发出一个请求 Request,得到一个响应后的内容 HttpResponse ,这个请求传递到 Django的过程如下: 也就是说,每一个请求都是先通 ...