背景

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. vue中$router以及$route的使用

    路由基本概念 route,它是一条路由. { path: '/home', component: Home } routes,是一组路由. const routes = [ { path: '/hom ...

  2. vue通过ajax加载json数据

    HTML <ul id="Hanapp"> <li class="styVue" v-for="item in actList&qu ...

  3. 20 IO流(十七)——Commons工具包,FileUtils(二)——copy方法

    copy方法 package com.sxt.copy; import java.io.File; import java.io.IOException; import java.net.URL; i ...

  4. 我在LeetCode的首次刷题

    到现在为止,我才发现我的博客一篇感受,心得,体会之言都没有. 今天就来随便扯扯. 刷题,是我最近一直在干的事情.也就每天写一两个.忘了就没写这种.也收藏了好几个刷题网站,当然第一次接触肯定是 WUST ...

  5. 通过 AppSwitch 禁用 WPF 内置的触摸让 WPF 程序可以处理 Windows 触摸消息

    原文:通过 AppSwitch 禁用 WPF 内置的触摸让 WPF 程序可以处理 Windows 触摸消息 WPF 框架自己实现了一套触摸机制,但同一窗口只能支持一套触摸机制,于是这会禁用系统的触摸消 ...

  6. Linux操作系统六大优点

    打开百度App,看更多图片 1.免费开源.Linux是一款完全免费的操作系统,任何人都可以从网络上下载到它的源代码,并可以根据自己的需求进行定制化的开发,而且没有版权限制. 2.模块化程度高.Linu ...

  7. java之struts2的配置讲解(2)

    在 java之struts框架入门教程 基础上,进行下列操作 1.结构对比 原来的项目结构图 现在的结构图 即从结构上可以看出,在HelloStruts项目中增加了config 文件夹(Source ...

  8. PCL提取圆柱系数

    网上看了很多教程,没看到圆柱提取后的系数解释. 源码如下: #include <pcl/ModelCoefficients.h> #include <pcl/io/pcd_io.h& ...

  9. 数据结构与算法(周测7-拓扑排序和AOV网络)

    判断题 1.AOE图的关键路径就是最长的路径      T      F 2.AOE图的权值最大的边(活动)一定是关键活动.      T      F 两条边相加可能比最大的边还要大. 3.在AOE ...

  10. HTML学习摘要4

    DAY 4 text-align 属性规定了元素中文本的水平对齐方式: <html> <body> <h1 style="text-align:center&q ...