云时代的 JVM 原理与实战
康杨
京东资深架构师
3111 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 39 讲
云时代的 JVM 原理与实战
15
15
1.0x
00:00/00:00
登录|注册

09|SPI机制:如何打造一个属于你的SPI程序?

你好,我是康杨,今天我们来聊聊 SPI。
SPI(Service Provider Interface)是一种服务发现机制,它允许应用程序在运行时动态地发现和加载实现某个接口的服务提供者。这里有两个关键词需要你特别关注,分别是“运行时”和“动态”。
作为一门面向对象语言,Java 虽然也提供了类似多态这样的动态机制,但是那是在编译时就已经决定了具体的服务提供方的一种方式,虽然能满足我们大部分关于动态的需求,但是复杂的现实环境依然存在需要在运行时才能决定服务提供者的需求,而这正是 SPI 的价值所在。

SPI 和 API 有什么不同?

SPI 看上去和我们熟知的 API 很像,所以当很多人谈到 SPI 时,经常拿 API 来和它作对比,下面我们就比较下两者的异同。相信对比之后,你对 SPI 的价值会有更深刻的理解。
SPI 是一种编程模式,用于定义和实现可插拔的服务提供者。它允许开发人员为特定的接口定义多个实现,并在运行时选择使用哪个实现。
API 目的是为开发人员提供一种简化和标准化的方式来使用现有功能和服务,以便更轻松地构建应用程序。
如果还不太容易理解,我可以给你举例说明一下,API 模式下你可以把自己想象成一个顾客,主厨就是开发者,他按照自己的喜好和经验为你提供了美食,这时候你只需要好好享用美食就可以了,当然这种模式下你享受的美食是在主厨的能力范围内的,比如这个主厨擅长西餐而你想吃一碗羊肉泡馍显然是不可以的,只能是主厨提供什么你就吃什么。而 SPI 模式,你的角色其实并不是开发者而是帮厨,或者说是美食的共建者,这种情况下主厨只是告诉你一份美食所应该遵守的规范,比如一份健康的料理所遵守的原则,而如何真正去打造出一款美食,就要靠你自己来实现了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

SPI 机制是一种灵活的服务发现机制,允许应用程序在运行时动态地发现和加载实现某个接口的服务提供者。相比于 API,SPI 提供了更灵活的扩展机制,允许开发者在运行时动态决定服务提供者。SPI 的实现需要遵循一定的约定,包括实现一个不带参数的构造函数、在 META-INF/services 目录下创建文件以接口的全限定名命名等。SPI 机制背后体现了开放封闭原则和控制反转的设计思想,使得软件实体对扩展开放,对修改封闭,并实现了对象之间的解耦。MySQL 的实践中也很好地应用了 SPI 机制,提升了扩展性和灵活性。SPI 机制的灵活性和扩展性使其在各种平台类的应用中得到广泛应用,如 Netty、Duboo、Spring 等。 文章通过实例详细介绍了 SPI 机制的实现过程,包括定义接口、开发者 A 和 B 的接口实现以及在平台中使用的过程。通过这些实例,读者可以清晰地了解 SPI 机制的具体应用和实现方式。同时,文章还提到了双亲委派模型在平台型应用的局限性,以及如何借助 SPI 机制来突破这种局限性,实现了运行时动态扩展程序的能力。SPI 的核心思想在于解耦,同时它也是开发封闭原则和控制反转思想很好的践行者,能够帮助开发者写出兼具灵活性和稳定性的程序。 最后,文章提出了一个思考题,鼓励读者动手打造自己的第一个 SPI 程序,并欢迎读者分享自己的代码。这样的引导能够激发读者的兴趣和参与度,使他们更好地理解和应用 SPI 机制。整体而言,本文通过具体实例和清晰的解释,使读者能够快速了解 SPI 机制的应用和实现方式,为他们在实际开发中应用 SPI 提供了有益的指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云时代的 JVM 原理与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(3)

  • 最新
  • 精选
  • quietwater
    必须给老师点赞!!!这节课将SPI的方方面面都深入浅出地讲透彻了,我在网上看了很多关于SPI的文章,都没有讲清楚,让我产生了很多疑问,今天在这里都得到了解答和确认。

    作者回复: 感谢支持,欢迎一起交流、探讨

    2023-09-13归属地:北京
    3
  • 好运来
    SPI通过线程上下文加载器,实现了可以通过父类加载器请求子类加载器去完成类加载器的动作,也就是打破了双亲委派模型的限制。 我理解其实没有打破限制吧,只是类加载器默认是 AppClassLoader,然后重新走一遍向上查找之后向下委托加载的流程。
    2023-09-13归属地:广东
    4
  • 文敦复
    请教下,这句话“根据双亲委派模型的规定,当一个接口的实现类位于父类加载器加载的类路径下时,子类记载器无法加载到该实现类。” 子类不是要向上找吗?为什么子类找不到父类加载器的加载的类?
    2024-01-05归属地:四川
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部