背景

Dubbo所有的模块加载是基于SPI机制的。在接口名的上一行加个@SPI注解表明要此模块要通过ExtensionLoader加载。基于SPI机制的扩展性比较好,在不修改原有代码,可以实现新模块的扩展。

获取AdaptiveExtension时序图

getAdaptiveExtension方法

代码图

从Hoder缓存取出目标对象,如果对象不为NULL直接返回对象本身。如果不存在且Throw对象为NULL,因为对象本身设置为全局的存在线程安全问题实例化对象时要加锁保证线程安全。实现化对象采用双锁单件设计模式。

参考

<headerFirst设计模式>书中的单件设计模式。

getExtensionClasses方法与getAdaptiveExtension方法类拟

loadExtensionClass方法

获取对应模块的所有Class对象,为动态实现化对象做准备工作。

loadFile方法

读取文件的每一行。格式:类的别名=类的包路径。类的路径转化成Class对象,判断Class对象是否有Adaptive注解,如果为TRUR,Class对象赋值给变量cachedAdaptiveClass.调用Class.getConstructor方法,如果没有抛出异常NoSuchMethodException,class对象添加到变量为cachedWrapperClassed的Set集合中。有异常NoSuchMethodException,Activate 对象增加到cachedActivates变量中,以Class对象为key,name为value保存到cachedNames的Map集合中。

createAdaptiveExtensionClass方法

模块中所有的类没有Active注解,需要动态创建一个。此时就要使用到该方法。

createAdaptiveExtensionClassCode方法

返回动态创建AdaptiveExtensionClassCode的String对象。

获取Extension对象

时序图

createExtension方法

通过name可以获取到class对象,再以class对象为key,来判断目标对象T是否缓存了。如果缓存了,返回对象。如果没有实例化对象并且调用对象所有的set方法,变量cacheWrapperClassed集合!=NULL及集合大小>0,实例化封装对象。

设计

装饰者设计模式

Dubbo源码分析(5):ExtensionLoader的更多相关文章

  1. Dubbo源码分析之ExtensionLoader加载过程解析

    ExtensionLoader加载机制阅读: Dubbo的类加载机制是模仿jdk的spi加载机制:  Jdk的SPI扩展加载机制:约定是当服务的提供者每增加一个接口的实现类时,需要在jar包的META ...

  2. dubbo源码分析6-telnet方式的管理实现

    dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...

  3. Dubbo 源码分析 - 集群容错之 Cluster

    1.简介 为了避免单点故障,现在的应用至少会部署在两台服务器上.对于一些负载比较高的服务,会部署更多台服务器.这样,同一环境下的服务提供者数量会大于1.对于服务消费者来说,同一环境下出现了多个服务提供 ...

  4. Dubbo 源码分析 - 服务导出

    1.服务导出过程 本篇文章,我们来研究一下 Dubbo 导出服务的过程.Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑.整个逻辑大致可 ...

  5. Dubbo源码分析

    Dubbo源码分析1 Dubbo源码分析2 dubbo源码阅读:rpc请求处理流程(1) 架构设计:系统间通信(17)——服务治理与Dubbo 中篇(分析) 13. Dubbo原理解析-注册中心之Zo ...

  6. dubbo源码分析1-reference bean创建

    dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...

  7. dubbo源码分析2-reference bean发起服务方法调用

    dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...

  8. dubbo源码分析3-service bean的创建与发布

    dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...

  9. dubbo源码分析4-基于netty的dubbo协议的server

    dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...

  10. dubbo源码分析5-dubbo的扩展点机制

    dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...

随机推荐

  1. PMBOK(第六版) PMP备考知识总汇!

    记录本人学习PMBOK第六版的学习笔记. 备考知识总汇! PMBOK序章 PMP备考指南之相关事项介绍 PMP备考指南之第一章:引论 PMP备考指南之第二章:项目运作环境 PMP备考指南之第三章:项目 ...

  2. c++ 通过sizeof运算符看内存对齐

    一.基础数据类型 基础数据类型的sizeof,包括char.short,int,long,float,double 注意:实际数值有所偏差,与系统相关 二.数组及字符串 包括字符数组.字符指针.字符串 ...

  3. 二次剩余定理及Cipolla算法入门到自闭

    二次剩余定义: 在维基百科中,是这样说的:如果q等于一个数的平方模 n,则q为模 n 意义下的二次剩余.例如:x2≡n(mod p).否则,则q为模n意义下的二次非剩余. Cipolla算法:一个解决 ...

  4. 【微信小程序学习笔记】入门与了解

    [微信小程序学习笔记(一)] IDE 下载安装 下载地址 官方工具:https://mp.weixin.qq.com/debug/w … tml?t=1476434678461 下载可执行文件后,可按 ...

  5. pyenv基本使用

    pyenv使用 1.安装: git clone https://github.com/pyenv/pyenv.git 2.配置pyenv环境变量 echo 'export PYENV_ROOT=&qu ...

  6. 数组中重复的数字(Golang)

    使用哈希表 package main import "fmt" func main() { a := [...]int{2,3,1,0,2,5,3} num := make(map ...

  7. Deep one-class classification

    Deep one-class classification 2019-03-17 23:09:59 zpainter 阅读数 1027  收藏 文章标签: 单分类问题异常检测 更多 分类专栏: 论文 ...

  8. java之struts2的ThreadLocal和ActionContext

    在之前的学习中,我们知道struts2可以将表单中的数据自动设置到处理类的属性上,还有类型转换等其他功能.那么struts2是怎样做这件事情的呢? struts2完成这些功能是通过拦截器来完成的,并且 ...

  9. 使用jQuery开发dialog对话框插件

    1.插件使用 首先引入 jquery 库,然后引入 dialog.js.dialog.css,如下: <script type="text/javascript" src=& ...

  10. bat 设置多个静态ip

    @echo off REM 本地连接名称 set NetName="本地连接 2" REM 默认IP netsh interface ipv4 set address name=% ...