转载自  斩秋的专栏  http://blog.csdn.net/quhongwei_zhanqiu/article/details/41577159


我们运行的Java代码,一般都是编译之后的字节码。Dubbo为了实现基于spi思想的扩展特性,特别是能够灵活添加额外功能,

对于扩展或者说是策略的选择这个叫做控制类也好设配类也好的类要能够动态生成。当然对应已知需求如Protocol, ProxyFactory

他们的策略选择的设配类代码dubbo直接提供也无妨,但是dubbo作为一个高扩展性的框架,使得用户能够添加自己的需求,

根据配置动态生成自己的设配类代码,这样就需要在运行的时候去编译加载这个设配类的代码。下面我们就是来了解下Dubbo的动态编译。

动态编译的实现的类图

编译接口定义

@SPI("javassist")

public interface Compiler {

  Class<?> compile(String code, ClassLoader classLoader);

}

SPI注解表示如果没有配置,dubbo默认选用javassist编译源代码

接口方法compile第一个入参code,就是java的源代码

接口方法compile第二个入参classLoader,按理是类加载器用来加载编译后的字节码,其实没用到,都是根据当前线程或者调用方的classLoader加载的

@Adaptive
public class AdaptiveCompiler implements Compiler { private static volatile String DEFAULT_COMPILER; public Class<?> compile(String code, ClassLoader classLoader) { Compiler compiler; ExtensionLoader<Compiler> loader = ExtensionLoader.getExtensionLoader(Compiler.class); String name = DEFAULT_COMPILER;// copyreference if (name !=null && name.length() > 0) { compiler =loader.getExtension(name);
} else { compiler =loader.getDefaultExtension(); } return compiler.compile(code, classLoader);
}
}

AdaptiveCompiler是Compiler的设配类, 它有类注解@Adaptive表示这个Compile r的设配类不是动态编译生成的。

AdaptiveCompiler作用就是策略的选择,根据条件选择何种编译策略来编译动态生成的源代码。

AbstractCompiler为编译的抽象类,抽象出公用逻辑,这里它主要是利用正则匹配出源代码中的包名和类名后先在jvm中Class.forName看下是否存在,

如果存在反回,不存在在执行编译与加载。

关于JavassistCompiler和JdkCompiler执行doCompile的过程都是利用Javassit和Jdk提供的相关api或者扩展接口实现的。

3. Dubbo原理解析-Dubbo内核实现之动态编译 (转)的更多相关文章

  1. 2. Dubbo原理解析-Dubbo内核实现之基于SPI思想Dubbo内核实现(转)

    转载自  斩秋的专栏  http://blog.csdn.net/quhongwei_zhanqiu/article/details/41577159 SPI接口定义 定义了@SPI注解 public ...

  2. 【DUBBO】 Dubbo原理解析-Dubbo内核实现之基于SPI思想Dubbo内核实现

    转载:http://blog.csdn.net/quhongwei_zhanqiu/article/details/41577235 SPI接口定义 定义了@SPI注解 public @interfa ...

  3. Dubbo原理解析-Dubbo内核实现之SPI简单介绍

    转自:https://blog.csdn.net/quhongwei_zhanqiu/article/details/41577159 Dubbo 采用微内核+插件体系,使得设计优雅,扩展性强.那所谓 ...

  4. 1. Dubbo原理解析-Dubbo内核实现之SPI简单介绍 (转)

    转载自  斩秋的专栏  http://blog.csdn.net/quhongwei_zhanqiu/article/details/41577159 Dubbo采用 微内核 + 插件体系,使得设计优 ...

  5. 【DUBBO】Dubbo原理解析-Dubbo内核实现之SPI简单介绍

    Dubbo采用微内核+ 插件体系,使得设计优雅,扩展性强.那所谓的微内核+插件体系是如何实现的呢!大家是否熟悉spi(service providerinterface)机制,即我们定义了服务接口标准 ...

  6. Java进阶专题(二十六) 将近2万字的Dubbo原理解析,彻底搞懂dubbo

    前言 ​ 前面我们研究了RPC的原理,市面上有很多基于RPC思想实现的框架,比如有Dubbo.今天就从Dubbo的SPI机制.服务注册与发现源码及网络通信过程去深入剖析下Dubbo. Dubbo架构 ...

  7. Java进阶专题(二十七) 将近2万字的Dubbo原理解析,彻底搞懂dubbo (下)

    ...接上文 服务发现 服务发现流程 整体duubo的服务消费原理 Dubbo 框架做服务消费也分为两大部分 , 第一步通过持有远程服务实例生成Invoker,这个Invoker 在客户端是核心的远程 ...

  8. Dubbo原理解析(非常透彻)

    一.概述 dubbo是一款经典的rpc框架,用来远程调用服务的. dubbo的作用: 面向接口的远程方法调用 智能容错和负载均衡 服务自动注册和发现. 自定义序列化协议 Dubbo 架构中的核心角色有 ...

  9. Dubbo原理解析-注册中心之Zookeeper协议注册中心

    下面我们来看下开源dubbo推荐的业界成熟的zookeeper做为注册中心, zookeeper是hadoop的一个子项目是分布式系统的可靠协调者,他提供了配置维护,名字服务,分布式同步等服务.对于z ...

随机推荐

  1. GitLab push除发Jenkins事件

    1.打开Jenkins项目配置 2.勾选Trigger builds remotely (e.g., from scripts) 3.Authentication Token随便填个内容(比方1234 ...

  2. 队列Queue、栈LifoQueue、优先级队列PriorityQueue

    队列:队列是先进先出. import queue q = queue.Queue() q.put(1) q.put(2) q.put(3) q.put(4) print(q.get()) print( ...

  3. G - Throw nails

    来源hde4393 The annual school bicycle contest started. ZL is a student in this school. He is so boring ...

  4. Q - Girls and Boys

    来源poj1068 In the second year of the university somebody started a study on the romantic relations be ...

  5. 前端上传 base64 编码图片到七牛云存储

    参考文档 如何上传base64编码图片到七牛云 调试过程 文档中分别有 java 和 html 的 demo,可以根据文档示例调试. 下面是我调试的过程,可以作为参考,特别注意的是,如果需要给文件起名 ...

  6. Moving Tables---(贪心)

    Problem Description The famous ACM (Advanced Computer Maker) Company has rented a floor of a buildin ...

  7. What do cryptic Github comments mean?

    LGTM  —  looks good to me ACK  —  acknowledgement, i.e. agreed/accepted change NACK/NAK — negative a ...

  8. node.js+ react + redux 环境搭建

    1.安装node.js 2. yarn init: 初始化,主要包含以下条目 name: 项目名 version: 版本号 description: 项目简要描述 entry point: 文件入口, ...

  9. linux中的cd

    cd命令 实例 hling@hling:~$ cd /home/hling/桌面/huanghling@hling:~/桌面/huang$ cd ..hling@hling:~/桌面$ cd ..hl ...

  10. C++/C面试题(2)

    (1)单向链表操作  1)在链表尾部插入一个节点 void addNewNodeTail(ListNode **HeadNode, int value)//在链表尾部插入一个节点{ ListNode* ...