文章目录

  • 简介
  • SPI的优势
  • SPI接口实现流程
  • SPI接口提供流程
  • dubbo与SPI
  • 反思

简介

SPI全称Service Provider Interface,顾名思义,就是接口提供服务。

一般做框架才会用到SPI,就是做抽象层、做标准流程,但是具体服务层要可定制,依赖与具体的业务,就可以使用SPI。

例如,数据驱动,JDK中的java.sql包中基本都是抽象层的东西,不和具体的数据库相关,它怎么实现,就是使用SPI。

当然,要做SPI的实现,也需要对SPI有所了解才行。

简单总结一下:

我定义抽象接口,并面向接口编程提供相应的工具类,提供服务的人来具体实现,其他人使用我的接口,我再使用具体的实现

SPI的优势

  1. 统一标准,可以使用共同的抽象层,否则每一种数据库的每一种驱动都有自己的标准和实现,这样大家学习成本就高了。

  2. 标准统一了,做工具的就能使用统一标准,这样又可以方便丰富生态,不用每个渠道都去做一套适配。

以java.sql.Driver为例,JDK定义了java.sql.Driver,告诉大家要做什么,如果大家这样这样做了,用户就可以直接使用JDK提供的java.sql包中的工具就可以操作数据库了,而不用关心MySQL的这种驱动到底怎样实现,MongoDB那种驱动怎么实现。

有点向设计模式中中介模式,都找中介,不用关心其他。

SPI接口实现流程

  1. classpath路径中添加一个/META-INF/services目录,一般具体那个classpath目录无所谓,放在JDK的lib目录下都行,不过为了让其他人也能使用你的jar包,最好放在自己的jar包中。

  2. 在/META-INF/services目录下添加一个要实现的接口的全限定名称的文件。例如,java.sql.Driver,文件中的内容是你实现这个接口的全限定类名,例如,com.mysql.cj.jdbc.Driver。如果有多个实现类,每行一个。

  3. 实现对应的接口

具体的处理逻辑在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是不是在炫技?相关推荐

  1. CES上百度无人车队炫技,陆奇要用“China speed”改变世界

    本文由 「AI前线」原创,原文链接:CES上百度无人车队炫技,陆奇要用"China speed"改变世界 编辑|Emily AI 前线导读:"美国当地时间 1 月 8 日 ...

  2. Python 炫技操作:合并字典的七种方法

    来源 | Python编程时光(ID: Cool-Python) Python 语言里有许多(而且是越来越多)的高级特性,是 Python 发烧友们非常喜欢的.在这些人的眼里,能够写出那些一般开发者看 ...

  3. Python炫技操作:条件语句的七种写法

    作者 | 写代码的明哥 来源 | Python编程时光 有的人说 Python 入门容易,但是精通难的语言,这点我非常赞同. Python 语言里有许多(而且是越来越多)的高级特性,是 Python ...

  4. java加减乘除运算代码_从“位运算”炫技到“操作符”,再到逐步理解“群论”...

    由位运算到操作符,再到逐步理解群论 Step by Step for Understanding from Bitwise to Operators, then Group Theory 是否曾经会有 ...

  5. 看完阿逗比年度炫技大会,我什么都不敢信了

    栗子 乾明 鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 一年一度,阿逗比(Adobe)又来炫技了. 许多魔法,曾经只在论文里出现,没有给麻瓜玩耍的通道,如今都能一键解锁. 比如,一键调 ...

  6. 【Python基础】Python 炫技操作:五种 Python 转义表示法

    相信对于不少同学来说,即使是非常不起眼的 转义, 本篇文章也是能学到不少东西的. 好了,以下是文章的正文. 1. 为什么要有转义? ASCII 表中一共有 128 个字符.这里面有我们非常熟悉的字母. ...

  7. JDK、Spring、Dubbo SPI 原理介绍

    导读: 需求变化是程序员生命中唯一不变的事情,本文将介绍 JDK/Spring/Dubbo 中的 SPI 机制,以此来帮助我们编写出一套可扩展性强,易于维护的代码框架. 文|杨亮 网易云商高级 Jav ...

  8. python管道安装包_Python 炫技操作:安装包的八种方法

    1. 使用 easy_install easy_install 这应该是最古老的包安装方式了,目前基本没有人使用了.下面是 easy_install 的一些安装示例# 通过包名,从PyPI寻找最新版本 ...

  9. git 回滚 add 操作_炫技!git 优雅回滚一次错误的合并操作!

    点击蓝色小字关注! 关注一下你就不会有bug!合并操作 相对于常规的 commit,当使用 git merge 合并两个分支的时候,你会得到一个新的 merge commit. 当我们 git sho ...

最新文章

  1. 关于阻塞I/O 非阻塞I/O 同步I/O 异步I/O epoll select的学习
  2. 六十六、丑数系列,丑的颠覆我的思想
  3. selenium脚本录制
  4. java输入一个字符给c赋值_C语言字符串的输入输出
  5. 2018年,免费、无水印录屏软件有哪些?
  6. 网易博客 android,android编译环境
  7. 这是一封摘抄的情书有点长你读不完也没关系
  8. BW数据加载后不能实时刷新到水晶易表解决方法
  9. 【String类】StringBuffer类 StringBuilder类
  10. java 9宫格抽奖_js 实现9宫格抽奖(react)
  11. 抖音提示原创度低,这会导致封号么?给你几点建议
  12. 爬取哔哩哔哩网站数据
  13. Android Audio 2: Audio相关术语
  14. 初中数学与计算机论文,初中数学优秀论文15篇
  15. 数字媒体技术专业延伸方向——特效
  16. 智慧数字经营小程序存在的意义和价值分析
  17. gin:包管理和路由拆分
  18. 2021-05-08 Web前端编程实验(八)
  19. CUDA atomic原子操作
  20. 内参(焦距)与视场角的转换关系

热门文章

  1. 基于Matlab的RC4加密图像
  2. 最强求职攻略:Java程序员如何通过谷歌、腾讯社招面试!
  3. vue.config.js中public是什么意思?
  4. Oracle EM13C安装部署以及使用
  5. 使用css选择器实现表格隔行换色
  6. QT实现一维码识别之Code128
  7. abaqus 关联 子程序_ABAQUS子程序关联当中的若干问题(一)
  8. 数据分箱——KS分箱/卡放分箱
  9. vue使用ueditor(vue-ueditor-wrap)
  10. Tom与Jerry谁先死?