DubboSPI机制二之Dubbo中SPI初体验
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初体验的更多相关文章
- Dubbo中SPI扩展机制解析
dubbo的SPI机制类似与Java的SPI,Java的SPI会一次性的实例化所有扩展点的实现,有点显得浪费资源. dubbo的扩展机制可以方便的获取某一个想要的扩展实现,每个实现都有自己的name, ...
- BSP中uboot初体验
一. uboot源码获取 1.1. 从板级厂家获取开发板BSP级uboot(就是由开发板厂家提供的) 1.2. 从SOC厂家获取相同SOC的BSP级uboot 1.3. 从uboot官方下载 1.4. ...
- Java进阶专题(二十八) Service Mesh初体验
前言 ⽬前,微服务的架构⽅式在企业中得到了极⼤的发展,主要原因是其解决了传统的单体架构中存在的问题.当单体架构拆分成微服务架构就可以⾼枕⽆忧了吗? 显然不是的.微服务架构体系中同样也存在很多的挑战 ...
- 用前端姿势玩docker【二】dockerfile定制镜像初体验
前言 书接上文,关于dockerfile指令的api在此处不做赘述,在此只是记录下注意事项: '示坑以埋之'. 配置指令 FROM dockerfile必须以此开头 一个dockerfile可执行添加 ...
- 二 APPIUM Android自动化 测试初体验
本文转自:http://www.cnblogs.com/sundalian/p/5629358.html 1.创建一个maven项目 成功新建工程: 编辑pom.xml,在<dependenci ...
- dubbo的spi机制
SPI SPI是一种扩展机制,在java中SPI机制被广泛应用,比如Spring中的SpringServletContainerInitializer 使得容器启动的时候SpringServletCo ...
- Dubbo(五):Dubbo中的URL统一资源模型与Dubbo协议
一.URL简介 URL也就是Uniform Resource Locator,中文叫统一资源定位符.Dubbo中无论是服务消费方,或者服务提供方,或者注册中心.都是通过URL进行定位资源的.所以今天来 ...
- Dubbo中的监控和管理
一.Dubbo中的监控 1.原理 原理:服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心. 2.搭建监控服务 3.修改配置文件 修改注册中心的地址: 注意:这个 ...
- Dubbo中的统一契约是如何实现的?
写在前面 之前,很多小伙伴私信我:如何才能快速的掌握Dubbo的核心原理和源码.所以,我写了一篇<我是如何在短期内快速掌握Dubbo的原理和源码的(纯干货)?>.对于Dubbo的源码解析系 ...
随机推荐
- Jeesite富文本编辑框ckeditor显示错误
Jeesite富文本编辑框ckeditor显示错误 原文链接:https://www.toutiao.com/i6485135618190869005/ Jeesite中Control都会继承一个Ba ...
- 论文翻译:2020_Nonlinear Residual Echo Suppression using a Recurrent Neural Network
论文地址:https://indico2.conference4me.psnc.pl/event/35/contributions/3367/attachments/779/817/Thu-1-10- ...
- Android官方文档翻译 一 Getting Started
Getting Started 让我们开始吧! Welcome to Training for Android developers. 欢迎来到Android开发者训练营. Here you'll f ...
- Solon 开发,五、切面与环绕拦截
Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...
- C# 实现Parallel.For
static class MyParallel { //4.0及以上用Task, Task的背后的实现也是使用了线程池线程 //static List<Task> tasks = new ...
- 搭建vps(virtual private station)之Github教育礼包之DigitalOcean
最近Github联合很多业内厂商给出了一份学生礼包,可以用来做很多事情,其中包括Digital Ocean的100$优惠,用他可以架设自己的云服务器,选择每月5$套餐可获得512Mb内存20g固态硬盘 ...
- 短视频正当时,如何让你的App快速构建视频创作能力?
视频编辑服务(Video Editor Kit)是华为开放给开发者快速构建视频编辑能力的服务,提供视频导入.编辑处理.特效渲染.视频导出.媒体资源管理等一站式视频处理能力.视频编辑服务为全球开发者提供 ...
- condition_variable中的和wait_once和notify_one及notify_all实例代码
// ConsoleApplication6.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include<thread> #in ...
- golang中如何退出goroutine
package main import ( "fmt" "runtime" "time" ) func main() { // 用gorou ...
- java-包与包之间的访问
1 package face_package; 2 3 import face_packagedemoA.DemoA; 4 5 /* 包(package) 6 * 1,对类文件进行分类管理. 7 * ...