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. vue2.0组件库

    UI组件 element - 饿了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的组件库 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开 ...

  2. 硬核 - Java 随机数相关 API 的演进与思考(下)

    本系列将 Java 17 之前的随机数 API 以及 Java 17 之后的统一 API 都做了比较详细的说明,并且将随机数的特性以及实现思路也做了一些简单的分析,帮助大家明白为何会有这么多的随机数算 ...

  3. day7 对字母数字的编排

    1.函数fun()的功能:在s数组内寻找并且统计t数组在s数组中出现的次数 输入字符串:函数scanf()函数不好用,会出现很多bug,因此不使用scanf() 效果理想: 2.函数fun()功能:将 ...

  4. JUC之线程池基础与简单源码分析

    线程池 定义和方法 线程池的工作时控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等待其他线程执行完成,再从队列中取出任 ...

  5. [STM32F4xx 学习] SPI小结

    一.STM32F4xx系列的SPI特点: 1. 支持全双工的3线SPI模式(即SCK, MISO, MOSI) 2. 支持单工2线传输,同时数据线可以设置成单向或者双向模式 3. 8-bit, 16- ...

  6. centos7 service iptables save 报错

    解决办法: 1.systemctl stop firewalld 2.yum install iptables-services 3.systemctl  restart iptables 4.ser ...

  7. 微前端框架 之 single-spa 从入门到精通

    前序 目的 会使用single-spa开发项目,然后打包部署上线 刨析single-spa的源码原理 手写一个自己的single-spa框架 过程 编写示例项目 打包部署 框架源码解读 手写框架 关于 ...

  8. Integer缓冲区相关问题--valueOf()方法

    今天在学习过程中了解到一个现象,代码如下: Integer num1 = 100; Integer num2 = 100; System.out.println(num1==num2?true:fal ...

  9. Linux配置Redis集群 和 缓存介绍。

    // 一.什么是缓存? mybatis一级缓存和二级缓存 mybatis的一级缓存存在哪? SqlSession,就不会再走数据库 什么情况下一级缓存会失效? 当被更新,删除的时候sqlsession ...

  10. 计算机网络再次整理————tcp例子[五]

    前言 本文介绍一些tcp的例子,然后不断完善一下. 正文 服务端: // See https://aka.ms/new-console-template for more information us ...