dubbo SPI是不是在炫技?
文章目录
- 简介
- SPI的优势
- SPI接口实现流程
- SPI接口提供流程
- dubbo与SPI
- 反思
简介
SPI全称Service Provider Interface,顾名思义,就是接口提供服务。
一般做框架才会用到SPI,就是做抽象层、做标准流程,但是具体服务层要可定制,依赖与具体的业务,就可以使用SPI。
例如,数据驱动,JDK中的java.sql包中基本都是抽象层的东西,不和具体的数据库相关,它怎么实现,就是使用SPI。
当然,要做SPI的实现,也需要对SPI有所了解才行。
简单总结一下:
我定义抽象接口,并面向接口编程提供相应的工具类,提供服务的人来具体实现,其他人使用我的接口,我再使用具体的实现
SPI的优势
统一标准,可以使用共同的抽象层,否则每一种数据库的每一种驱动都有自己的标准和实现,这样大家学习成本就高了。
标准统一了,做工具的就能使用统一标准,这样又可以方便丰富生态,不用每个渠道都去做一套适配。
以java.sql.Driver为例,JDK定义了java.sql.Driver,告诉大家要做什么,如果大家这样这样做了,用户就可以直接使用JDK提供的java.sql包中的工具就可以操作数据库了,而不用关心MySQL的这种驱动到底怎样实现,MongoDB那种驱动怎么实现。
有点向设计模式中中介模式,都找中介,不用关心其他。
SPI接口实现流程
classpath路径中添加一个/META-INF/services目录,一般具体那个classpath目录无所谓,放在JDK的lib目录下都行,不过为了让其他人也能使用你的jar包,最好放在自己的jar包中。
在/META-INF/services目录下添加一个要实现的接口的全限定名称的文件。例如,java.sql.Driver,文件中的内容是你实现这个接口的全限定类名,例如,com.mysql.cj.jdbc.Driver。如果有多个实现类,每行一个。
实现对应的接口
具体的处理逻辑在ServiceLoader这个类中:
ServiceLoader中的LazyIterator内部类的hasNextService方法,是加载配置资源文件的实现。
ServiceLoader的parseLine方法是具体解析配置文件的实现。
SPI接口提供流程
给定SPI接口,提供相应的工具类,可以参考Java的DriverManager的loadInitialDrivers方法。
dubbo与SPI
dubbo没有使用JDK的ServiceLoader,而是自己写了一个ExtensionLoader来实现相应的逻辑。
反思
我们真的有必要使用SPI么?直接使用接口,提供注册方式它不香吗?
当然这个得具体问题,具体分析。
JDK的java.sql.Driver处理数据库驱动,使用SPI方式比较恰当,因为可以屏蔽用户与三方驱动的关系,减少用户学习成本。
Dubbo使用SPI,倒不是不可以,只是个人觉得没有必要。
比如Dubbo的Filter,Filter这种非常个性化的一般都是特定实现,就是说我用我才会自己去实现,难道有第三方专门提供一些Filter,然后打个jar包给大家用?
不要说Filter,有多少大家使用的Dubbo扩展第三方jar包?
我都自己实现Filter了,当然就不用谈学习成本了,结果还非要我按规则来弄个配置文件,给个注册Filter的接口它不香么?使用注解,给一个注解工具类,它不方便么?
dubbo SPI是不是在炫技?相关推荐
- CES上百度无人车队炫技,陆奇要用“China speed”改变世界
本文由 「AI前线」原创,原文链接:CES上百度无人车队炫技,陆奇要用"China speed"改变世界 编辑|Emily AI 前线导读:"美国当地时间 1 月 8 日 ...
- Python 炫技操作:合并字典的七种方法
来源 | Python编程时光(ID: Cool-Python) Python 语言里有许多(而且是越来越多)的高级特性,是 Python 发烧友们非常喜欢的.在这些人的眼里,能够写出那些一般开发者看 ...
- Python炫技操作:条件语句的七种写法
作者 | 写代码的明哥 来源 | Python编程时光 有的人说 Python 入门容易,但是精通难的语言,这点我非常赞同. Python 语言里有许多(而且是越来越多)的高级特性,是 Python ...
- java加减乘除运算代码_从“位运算”炫技到“操作符”,再到逐步理解“群论”...
由位运算到操作符,再到逐步理解群论 Step by Step for Understanding from Bitwise to Operators, then Group Theory 是否曾经会有 ...
- 看完阿逗比年度炫技大会,我什么都不敢信了
栗子 乾明 鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 一年一度,阿逗比(Adobe)又来炫技了. 许多魔法,曾经只在论文里出现,没有给麻瓜玩耍的通道,如今都能一键解锁. 比如,一键调 ...
- 【Python基础】Python 炫技操作:五种 Python 转义表示法
相信对于不少同学来说,即使是非常不起眼的 转义, 本篇文章也是能学到不少东西的. 好了,以下是文章的正文. 1. 为什么要有转义? ASCII 表中一共有 128 个字符.这里面有我们非常熟悉的字母. ...
- JDK、Spring、Dubbo SPI 原理介绍
导读: 需求变化是程序员生命中唯一不变的事情,本文将介绍 JDK/Spring/Dubbo 中的 SPI 机制,以此来帮助我们编写出一套可扩展性强,易于维护的代码框架. 文|杨亮 网易云商高级 Jav ...
- python管道安装包_Python 炫技操作:安装包的八种方法
1. 使用 easy_install easy_install 这应该是最古老的包安装方式了,目前基本没有人使用了.下面是 easy_install 的一些安装示例# 通过包名,从PyPI寻找最新版本 ...
- git 回滚 add 操作_炫技!git 优雅回滚一次错误的合并操作!
点击蓝色小字关注! 关注一下你就不会有bug!合并操作 相对于常规的 commit,当使用 git merge 合并两个分支的时候,你会得到一个新的 merge commit. 当我们 git sho ...
最新文章
- 关于阻塞I/O 非阻塞I/O 同步I/O 异步I/O epoll select的学习
- 六十六、丑数系列,丑的颠覆我的思想
- selenium脚本录制
- java输入一个字符给c赋值_C语言字符串的输入输出
- 2018年,免费、无水印录屏软件有哪些?
- 网易博客 android,android编译环境
- 这是一封摘抄的情书有点长你读不完也没关系
- BW数据加载后不能实时刷新到水晶易表解决方法
- 【String类】StringBuffer类 StringBuilder类
- java 9宫格抽奖_js 实现9宫格抽奖(react)
- 抖音提示原创度低,这会导致封号么?给你几点建议
- 爬取哔哩哔哩网站数据
- Android Audio 2: Audio相关术语
- 初中数学与计算机论文,初中数学优秀论文15篇
- 数字媒体技术专业延伸方向——特效
- 智慧数字经营小程序存在的意义和价值分析
- gin:包管理和路由拆分
- 2021-05-08 Web前端编程实验(八)
- CUDA atomic原子操作
- 内参(焦距)与视场角的转换关系