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, 扩展器)

下面是大致得过程图

原文地址:https://www.cnblogs.com/qiaozhuangshi/p/11007051.html

时间: 2024-11-01 11:12:15

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

php动态编译mysqli扩展

在源PHP安装文件中进入注意是你下载的php源文件软件包cd ./php-5.5.4/ext/mysqli注意要先确保/server/php/bin/php-config存在/server/php/bin/phpize ./configure --prefix=/server/php/lib/php/extensions \--with-php-config=/server/php/bin/php-config \--with-mysqli=/server/mysql/bin/mysql_con

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

Dubbo是一款开源的.高性能且轻量级的Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用.智能容错和负载均衡,以及服务自动注册和发现. Dubbo最早是阿里公司内部的RPC框架,于 2011 年开源,之后迅速成为国内该类开源项目的佼佼者,2018年2月,通过投票正式成为 Apache基金会孵化项目.目前宜信公司内部也有不少项目在使用Dubbo. 本系列文章通过拆解Dubbo源码,帮助大家了解Dubbo,做到知其然,并且知其所以然. 一.JDK SPI 1.1 什么是SPI? S

Dubbo中SPI扩展机制解析

dubbo的SPI机制类似与Java的SPI,Java的SPI会一次性的实例化所有扩展点的实现,有点显得浪费资源. dubbo的扩展机制可以方便的获取某一个想要的扩展实现,每个实现都有自己的name,可以通过name找到具体的实现. 每个扩展点都有一个@Adaptive实例,用来注入到依赖这个扩展点的某些类中,运行时通过url参数去动态判断最终选择哪个Extension实例用. dubbo的SPI扩展机制增加了对扩展点自动装配(类似IOC)和自动包装(类似AOP)的支持. 标注了@Activat

ios 中Category类别(扩展类)专题总结

原创地址   http://www.code4blog.com/archives/294 类别 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,可以为现有的类添加新方法,这种为现有的类添加新方法的方式称为类别catagory,他可以为任何类添加新的方法,包括那些没有源代码的类. 类别使得无需创建对象类的子类就能完成同样的工作 一.创建类别 1.声明类别 声明类别与声明类的形式很相似 @interface  NSString(NumberConvenienc

构建施耐德楼控系统数据库后台服务器示例工程五(JAVA动态生成类)

在做数据库简易工具的过程中遇到了这么一个问题,即程序部署在tomcat下启动运行后,我们无法事先定义数据库中后续创建的表结构的Hibernate Bean对象,这样就需要我们在服务器运行起来后动态创建bean对象.cglib这个开源库即可解决我们的问题,动态创建JAVA对象. 1.cglib开源库简介 CGLIB(Code Generation Library)是一个开源项目,是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口. 反编译后CGLIB结构

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

本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(5)--案例:如何应对参数嗅探 我们抛开参数嗅探的话题,回到了本系列的最初关注点中:为什么语句在应用程序中慢,但是在SSMS中快?到目前为止,都是在说存储过程的情况.而存储过程的问题通常是因为SET ARITHABORT的不同设置项的原因.如果你的应用不使用存储过程,而是通过中间层提交客户端的查询,那么也有几个原因可能让你的查询因为不同的缓存条目从而使得在SSMS和应用程序中的运

objective-c中Category类别(扩展类)专题总结

objective-c中Category 类别.扩展 专题总结 http://blog.csdn.net/jiajiayouba/article/details/21105873 分类: IOS 2014-03-12 18:19 1293人阅读 评论(0) 收藏 举报 类别扩展 objective-c中Category类别(扩展类)专题总结 objective-c类别的作用? 通过类别的方式,可以将类的实现分散到不同的文件里. haoxue 2011-11-19 14:03 类别 类别是一种为现

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

本文转载至 http://yul100887.blog.163.com/blog/static/20033613520126333344127/ objective-c类别的作用?通过类别的方式,可以将类的实现分散到不同的文件里. 类别类别是一种为现有的类添加新方法的方式.利用Objective-C的动态运行时分配机制,可以为现有的类添加新方法,这种为现有的类添加新方法的方式称为类别catagory,他可以为任何类添加新的方法,包括那些没有源代码的类.类别使得无需创建对象类的子类就能完成同样的工

C++实现根据类名动态生成类对象

在开发后台服务的过程中,我们常常需要从数据库中取数据,并将数据缓存在本地中,另外,我们的服务还需要有更新数据的能力:包括定时的主动更新以及数据库数据更新时服务收到通知的被动更新. 之前在需要用到以上功能的时候,模仿着组内通用的数据Cache部分的代码来写,十分方便,基本上只需要自己写两个类:一个是取数据并缓存数据的类XXXData,一个是扇出数据的类XXXFetcher. 在需要使用数据的时候,通过: FetcherFactory::getFetcher<XXXFetcher>() 即可获取一