浅析Java - SPI机制 | 京东云技术团队
SPI是什么
SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。
整体机制如下图
Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。
使用场景
适用于:调用者根据实际使用需要,启用、扩展、或者替换框架的实现策略
比较常见的例子:
-
数据库驱动加载接口实现类的加载,JDBC加载不同类型数据库的驱动
-
日志门面接口实现类加载,SLF4J加载不同提供商的日志实现类
-
Spring中大量使用了SPI,比如:对servlet3.0规范对ServletContainerInitializer的实现、自动类型转换Type Conversion SPI(Converter SPI、Formatter SPI)等
-
Dubbo中也大量使用SPI的方式实现框架的扩展, 不过它对Java提供的原生SPI做了封装,允许用户扩展实现Filter接口
使用介绍
要使用Java SPI,需要遵循如下约定:
-
当服务提供者提供了接口的一种具体实现后,在jar包的META-INF/services目录下创建一个以“接口全限定名”为命名的文件,内容为实现类的全限定名;
-
接口实现类所在的jar包放在主程序的classpath中;
-
主程序通过java.util.ServiceLoder动态装载实现模块,它通过扫描META-INF/services目录下的配置文件找到实现类的全限定名,把类加载到JVM;
-
SPI的实现类必须携带一个不带参数的构造方法;
总结
-
优点:使用Java SPI机制的优势是实现解耦,使得第三方服务模块的装配控制的逻辑与调用者的业务代码分离,而不是耦合在一起。应用程序可以根据实际业务情况启用框架扩展或替换框架组件。
-
缺点:
-
虽然ServiceLoader也算是使用的延迟加载,但是基本只能通过遍历全部获取,也就是接口的实现类全部加载并实例化一遍。如果你并不想用某些实现类,它也被加载并实例化了,这就造成了浪费。获取某个实现类的方式不够灵活,只能通过Iterator形式获取,不能根据某个参数来获取对应的实现类。
-
多个并发多线程使用ServiceLoader类的实例是不安全的。
-
作者:京东零售 曹志飞
来源:京东云开发者社区 转载请注明来源

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
【稳定性】揭秘团队快速排查问题的三字经,你学会了吗? | 京东物流技术团队
背景 线上故障是技术成长中不可避免的一部分,我们从中能够吸取宝贵的教训并变得越来越有经验。然而,并非每个团队或技术同学都能以合理和科学的方式处理故障。基于日常实际工作经验和个人心得,我整理了一份团队遇到故障问题或者疑似问题快速排查的三字经清单及正确✅案例和错误❌案例。这份清单将帮助你在遇到问题时进行快速排查,无需担心在高压环境下忙中出错,遗漏关键步骤环节。掌握这份清单,你将能够更好地掌控现场,从而避免因疏忽而造成的损失。让我们面对故障时保持冷静,有条不紊地进行排查,不断提升我们的技术水平和问题解决能力。 三字经 备注:下面不是严格的顺序,需要根据实际情况调整可多路并行,比如清楚问题大概环节,先止血。如不清楚,报备分工,初步定位大概环节再快速止血。 在故障处理过程中采取的所有手段和行动,一切以恢复业务为最高优先级,恢复现场快速止血方案高于寻找故障原因等其他所有环节。 别慌张,先报备 先组会,明分工 描现象,非结论 先止血,再定位 看监控,看日志 找规律、先试验 看输入,看输出 留现场,时反馈 别慌张,先报备 1、在处理紧急事件(线上问题或者疑似问题)时,先把问题上报组内。 2、充分发挥团...
- 下一篇
存储方案作为产品——Midgard探索
作者 | greatstone94 导读 互联网业务大多是围绕数据展开,获取、生产数据,投入到产品中为用户服务。百度的搜索业务正是典型的数据密集业务,数据规模大,使用方式多样,极为关注如何构建高效低成本的存储系统。 然而软硬件技术升级、业务增长与变迁从未停止,一个久经验证的方案可能在短短半年后就偏离了设计之初的最佳状态。Midgard是搜索场景下提出的智能化的数据存储方案管理器,本文简要介绍了Midgard如何有效利用数据自身提供的信息,如何利用存储系统的先进特性,始终保持数据服务的高效低廉。 全文3733字,预计阅读时间10分钟。 01 存储需求如何变动 为了说明业务和技术同时驱动着存储方案的变化,此处举一个较为容易理解的例子:网页的倒排索引构建。 假设我们要经营一个叫做tendu的检索服务,业务就是接受一批网页集合,并对这些网页提供检索服务,当网页集合或者网页内容发生变化时,也将这些变化更新到检索结果中。 1.1业务起步——方案 1.0 tendu业务初起步的时候需求是非常简单明了的,因为规模和性能并非瓶颈,需求说明往往是流程性的。我们给出下面这样一个模型来示意这批网页的检索服务应...
相关文章
文章评论
共有0条评论来说两句吧...