Dubbo#编译动态扩展类
这篇排版有问题 后面修改....****
以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#编译动态扩展类的更多相关文章
- Alibaba Java诊断工具Arthas查看Dubbo动态代理类
原创/朱季谦 阅读Dubbo源码过程中,会发现,Dubbo消费端在做远程调用时,默认通过 Javassist 框架为服务接口生成动态代理类,接着再去调用代理类实现远程接口调用.在阅读这部分源码时,最后 ...
- Dubbo源码解析之SPI(一):扩展类的加载过程
Dubbo是一款开源的.高性能且轻量级的Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用.智能容错和负载均衡,以及服务自动注册和发现. Dubbo最早是阿里公司内部的RPC框架,于 ...
- PHP7 学习笔记(九)phpsize动态编译openssl扩展 (微信公众平台)
先吐槽,微信公众平台授权出问题了,尽然访问不了 一.问题描述: 使用PHP中的库函数file_get_contents时出现Unable to find the wrapper "https ...
- Dubbo中SPI扩展机制解析
dubbo的SPI机制类似与Java的SPI,Java的SPI会一次性的实例化所有扩展点的实现,有点显得浪费资源. dubbo的扩展机制可以方便的获取某一个想要的扩展实现,每个实现都有自己的name, ...
- 这个Dubbo注册中心扩展,有点意思!
今天想和大家聊聊Dubbo源码中实现的一个注册中心扩展.它很特殊,也帮我解决了一个困扰已久的问题,刚刚在生产中用了,效果很好,迫不及待想分享给大家. Dubbo的扩展性非常灵活,可以无侵入源码加载自定 ...
- Java+7入门经典 - 6 扩展类与继承 Part 1/2
第6章 扩展类与继承 面向对象编程的一个重要特性: 允许基于已定义的类创建新的类; 6.1 使用已有的类 派生 derivation, 派生类 derived class, 直接子类 direct s ...
- 理解性能的奥秘——应用程序中慢,SSMS中快(6)——SQL Server如何编译动态SQL
本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(5)--案例:如何应对参数嗅探 我们抛开参数嗅探的话题,回到了本系列的最 ...
- 使用Dubbo的SPI扩展机制实现自定义LoadBalance——方法二 不改源码添加META-INF/dubbo元数据
一.官网提供的方法 参考官网 http://dubbo.apache.org/zh-cn/docs/dev/impls/load-balance.html 二.方法总结 在工程中创建类并实现LoadB ...
- [ios]objective-c中Category类别(扩展类)专题总结
本文转载至 http://yul100887.blog.163.com/blog/static/20033613520126333344127/ objective-c类别的作用?通过类别的方式, ...
随机推荐
- Ubuntu16.04 apache2+php7.0+mysql5.7环境搭建
今天配置一下web环境,很常见的apache+php+mysql的网站环境: 步骤一:安装apache sudo apt install apache2 步骤二:安装php7 1.安装PHP7和响应的 ...
- 最简单的SpringAop 小案例
网盘下载地址: 链接:https://pan.baidu.com/s/1Z-em-1ouWyXeMP3JW0IbCg 提取码:0o4o 1.目录结构: 2.配置文件 applicationCo ...
- 4.弹性网络( Elastic Net)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_21904665/article/details/52315642 ElasticNet 是一种 ...
- C++利用openssl进行公钥解密
私钥加密的部分内容,需要用公钥解密下面的实例代码,由于私钥加密后的字符串有不可打印字符,所以程序里面进行了base64,要用的时候先解dec base64 再传递给函数 进行解密 #include & ...
- Win+数字快速启动/切换指定程序
Windows键+数字,可以快速启动任务栏上的程序 按下按下Win+4桌面将切换到排序第4的程序:页也就是谷歌浏览器. 今天刚发现这个小功能. 文章来源:外星人来地球 欢迎关注,有问题一起学习欢迎 ...
- HTTP请求客户端工具类
1.maven 引入依赖 <dependency> <groupId>commons-httpclient</groupId> <artifactId> ...
- 简易的CRM系统案例之Struts2+JSP+MySQL版本
对简易的CRM系统案例之Servlet+Jsp+MySQL版本改进 Servlet优化为Struts2 学习 <?xml version="1.0" encoding=&qu ...
- ISO/IEC 9899:2011 条款6.4.1——关键字
6.4.1 关键字 语法 1.以下为关键字: auto break case char const continue default do double ...
- (二)Centos之在VM虚拟机中安装Centos操作系统
一.下载 阿里云镜像 https://mirrors.aliyun.com/centos/7/isos/x86_64/ 下载那个 DVD版本即可. 二.安装 在安装操作系统之前 我们来给这个“机器”搞 ...
- iOS 在iphoneX上运行的app没有icon图标,在其他手机上有图标
今天朋友问了一个问题,在iPhoneX上运行的app没有icon图标,在其他手机上有图标. 一开始我以为是没放iPhoneX的图标,后面朋友解决了,告诉了我原因,这里记录下吧: 原因: 图标格式问题, ...