Dubbo高级之一SPI机制之JDK中的SPI - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中阐述了JDK标准的SPI,并对其应用做了相应的实践。在实际应用中,很多框架都会对其进行扩展改进实现该框架下的SPI。为什么呢?根据dubbo的官方文档可知,dubbo对JDK标准的SPI的改进:

    

  通过将上篇的实践案例增加一个HelloService的实现发现其明显的不足,特别是资源紧张的时候:

    

    

  执行主程序,查看结果:

    

  通过结果,可以看到JDK标志的SPI会一次性实例化所有扩展点的实现。如果资源紧张且扩展实现初始化很耗时而有些扩展并没有用上,会相当浪费资源。

  实践中实现类加断点,执行主程序查看其初始化的进度:

    

    

  如果不继续执行,通过结果可以看到打断点本身的实现类不会加载,没有打断点的实现类也不会加载(加载顺序与文件内容顺序一致)。所以可能出现如果有扩展点加载失败,则所有扩张点均无法使用的情况。

  Dubbo框架解决了以上两个问题同时扩展了其他相关的功能。dubbo的jar中可以看到其通过SPI的方式定制化实现了哪些扩展点:

    

  可以看到默认加载的内容文件在dubbo目录下。

  下面实践使用Dubbo扩展点的方式:

    1、引入dubbo依赖,创建接口在接口上标注@SPI

      

    2、实现类项目中

      1)导入api依赖

        

      2)建立实现类

        

      3)SPI进行声明操作

        

    3、执行主程序项目

      1)导入坐标接口项目和实现类项目

        

      2)创建执行类

        

    执行结果如下:

      

  通过上面的的实践案例,使用Dubbo的SPI与JDK标准的SPI好像区别不大,只是在接口类中需加上@SPI这个注解,否则无法加载该扩展。那么这个注解的作用是什么呢?查看该注解源码。

    

  重点关注该注解源码中的注释,详细阐述了该注解的作用:

    

  所以@SPI的本质就是给某个扩展点的多个实现加标签标识用于指明该SPI的默认实现,这样即使无法加载也可以很明确的支持哪个标签对应的扩展无法加载,而不是笼统的某类扩展点无法加载。  

  在实践案例中,扩展配置文件内容格式并没有改为<key, value>的形式,但是不影响执行的结果。是不是可以说明dubbo扩展配置文件其实也是支持不使用<key, value>形式的格式文件?

  

  

    

  

DubboSPI机制二之Dubbo中SPI初体验的更多相关文章

  1. Dubbo中SPI扩展机制解析

    dubbo的SPI机制类似与Java的SPI,Java的SPI会一次性的实例化所有扩展点的实现,有点显得浪费资源. dubbo的扩展机制可以方便的获取某一个想要的扩展实现,每个实现都有自己的name, ...

  2. BSP中uboot初体验

    一. uboot源码获取 1.1. 从板级厂家获取开发板BSP级uboot(就是由开发板厂家提供的) 1.2. 从SOC厂家获取相同SOC的BSP级uboot 1.3. 从uboot官方下载 1.4. ...

  3. Java进阶专题(二十八) Service Mesh初体验

    前言 ​ ⽬前,微服务的架构⽅式在企业中得到了极⼤的发展,主要原因是其解决了传统的单体架构中存在的问题.当单体架构拆分成微服务架构就可以⾼枕⽆忧了吗? 显然不是的.微服务架构体系中同样也存在很多的挑战 ...

  4. 用前端姿势玩docker【二】dockerfile定制镜像初体验

    前言 书接上文,关于dockerfile指令的api在此处不做赘述,在此只是记录下注意事项: '示坑以埋之'. 配置指令 FROM dockerfile必须以此开头 一个dockerfile可执行添加 ...

  5. 二 APPIUM Android自动化 测试初体验

    本文转自:http://www.cnblogs.com/sundalian/p/5629358.html 1.创建一个maven项目 成功新建工程: 编辑pom.xml,在<dependenci ...

  6. dubbo的spi机制

    SPI SPI是一种扩展机制,在java中SPI机制被广泛应用,比如Spring中的SpringServletContainerInitializer 使得容器启动的时候SpringServletCo ...

  7. Dubbo(五):Dubbo中的URL统一资源模型与Dubbo协议

    一.URL简介 URL也就是Uniform Resource Locator,中文叫统一资源定位符.Dubbo中无论是服务消费方,或者服务提供方,或者注册中心.都是通过URL进行定位资源的.所以今天来 ...

  8. Dubbo中的监控和管理

    一.Dubbo中的监控 1.原理 原理:服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心. 2.搭建监控服务 3.修改配置文件 修改注册中心的地址: 注意:这个 ...

  9. Dubbo中的统一契约是如何实现的?

    写在前面 之前,很多小伙伴私信我:如何才能快速的掌握Dubbo的核心原理和源码.所以,我写了一篇<我是如何在短期内快速掌握Dubbo的原理和源码的(纯干货)?>.对于Dubbo的源码解析系 ...

随机推荐

  1. hal 编码器做用户输入时捕获初值的设置

    uint16_t encoderDirection = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3); uint16_t encoderValue = __HA ...

  2. 单篇长文TestNG从入门到精通

    简介 TestNG是Test Next Generation的缩写,它的灵感来自于JUnit和NUnit,在它们基础上增加了很多很牛的功能,比如说: 注解. 多线程,比如所有方法都在各自线程中,一个测 ...

  3. 【pwn】学pwn日记(堆结构学习)

    [pwn]学pwn日记(堆结构学习) 1.什么是堆? 堆是下图中绿色的部分,而它上面的橙色部分则是堆管理器 我们都知道栈的从高内存向低内存扩展的,而堆是相反的,它是由低内存向高内存扩展的 堆管理器的作 ...

  4. 【记录一个问题】opencv + cuda编译release版本后,链接出现奇怪的符号

    链接出现以下信息: 1 /home/admin/opencv/20190610_cuda_release/lib64/libopencv_core.a(ocl.cpp.o): In function ...

  5. gorm连接mysql的初始化配置

    包含mysql配置.gorm配置.连接池配置.log日志配置 init_db_log.go文件代码 package main import ( "fmt" "gorm.i ...

  6. jetson-nano opencv基础使用

    前言: jetson nano前一篇给大家介绍了学习的一些思路和资料,今天继续给大家分享一篇在jetson nano使用opencv的文章. OpenCV的全称是Open Source Compute ...

  7. python变量系列--1

    所以这里需要注意变量的使用,print(message),直接去引用,和shell略有不同 1.变量名只能包含字母,数字,下划线,但不能以数字开头 2.变量名不能含有空格

  8. docker中使用systemctl启动服务

    解决 Failed to get D-Bus connection: Operation not permitted https://serverfault.com/questions/824975/ ...

  9. Java 继承01

    继承 ●示例 class Person { public String name; Person(){ System.out.println("Person Constrctor...&qu ...

  10. Redis 源码简洁剖析 07 - main 函数启动

    前言 问题 阶段 1:基本初始化 阶段 2:检查哨兵模式,执行 RDB 或 AOF 检测 阶段 3:运行参数解析 阶段 4:初始化 server 资源管理 初始化数据库 创建事件驱动框架 阶段 5:执 ...