当前位置: 首页 > news >正文

详细对比Java SPI、Spring SPI 和 Dubbo SPI

SPI(Service Provider Interface)概述

  • 定义:SPI是一种动态替换发现机制,用于实现接口与实现的解耦,提高框架的可扩展性。
  • 核心思想:解耦和方便扩展。

Java SPI

  • 约定规范
    • 扩展类文件放在META-INF/services/目录下。
    • 文件名是接口的全限定名,内容为实现类的全限定名。
  • 加载方式
    ServiceLoader<ISearch> serviceLoader = 
    ServiceLoader.load(ISearch.class);
    
  • 优缺点
    • 优点:接口与实现分离。
    • 缺点:一次性实例化所有扩展实现,资源浪费;不能按需加载。

Spring SPI

  • 约定规范
    • 文件放在META-INF/目录下,名为spring.factories
    • 文件内容为键值对,键为接口全限定名,值为实现类的全限定名,多个实现用逗号分隔。
  • Spring Boot 3.0 后
    • 可在META-INF/spring/下的org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中配置。
  • 加载方式
    List<PropertySourceLoader> propertySourceLoaders = SpringFactoriesLoader.loadFactories(PropertySourceLoader.class, getClass().getClassLoader());
    
  • 优缺点
    • 优点:不同接口扩展写在一个文件中,方便管理和扩展。
    • 缺点:没有实现按需加载,需要自定义加载逻辑。

Dubbo SPI

  • 约定规范
    • 接口必须加@SPI注解。
    • 配置文件可放在四个目录下,文件名为接口的全限定名。
    • 内容为键值对,键为短名称,值为实现类的全限定名。
  • 基础加载方式
    ExtensionLoader<IBusinessService> extensionLoader = ExtensionLoader.getExtensionLoader(IBusinessService.class);
    
  • 自适应扩展
    • 静态方式:使用@Adaptive注解的类,如AdaptiveCompiler
    • 动态方式:运行时动态生成Adaptive类,如Protocol$Adaptive.class
  • 自动激活
    • 使用@Activate注解,根据入参动态选择实现类,如GenericFilter

总结

  • SPI机制是提高软件模块化和可扩展性的关键技术。
  • Java SPI、Spring SPI和Dubbo SPI各有特点,适用于不同的场景和需求。
  • 了解和掌握SPI机制有助于更好地使用和扩展现有框架。

相关文章:

  • 【机器学习】特征选择:精炼数据,提升模型效能
  • 暴雨突袭不可不看!水浸传感器作用有这些
  • ubuntu 查看联网配置
  • PaddleVideo:Squeeze Time算法移植
  • WebOffice在线编微软Offfice,并以二进制流的形式打开Word文档
  • 【软件测试】 1+X初级 功能测试试题
  • antDesignPro随记
  • Python OpenCV 教学取得视频资讯
  • 电动卡丁车语音芯片方案选型:让驾驶体验更智能、更安全
  • el-date-picker 禁用 之前 和 之后 的时间
  • uniapp easycom组件冲突
  • 云服务部署和管理:容器化与微服务的融合之道
  • mybatisplus不想输出批量插入和查询日志
  • 观察矩阵(View Matrix)、投影矩阵(Projection Matrix)、视口矩阵(Window Matrix)及VPM矩阵及它们之间的关系
  • 微服务-初级篇
  • 网络传输文件的问题
  • #Java异常处理
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • CSS魔法堂:Absolute Positioning就这个样
  • ECS应用管理最佳实践
  • flutter的key在widget list的作用以及必要性
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JavaScript 基础知识 - 入门篇(一)
  • Javascript设计模式学习之Observer(观察者)模式
  • Java知识点总结(JavaIO-打印流)
  • k个最大的数及变种小结
  • Material Design
  • mysql_config not found
  • mysql外键的使用
  • nodejs:开发并发布一个nodejs包
  • PHP的Ev教程三(Periodic watcher)
  • Python - 闭包Closure
  • python学习笔记-类对象的信息
  • ubuntu 下nginx安装 并支持https协议
  • Wamp集成环境 添加PHP的新版本
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 技术胖1-4季视频复习— (看视频笔记)
  • 来,膜拜下android roadmap,强大的执行力
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 容器服务kubernetes弹性伸缩高级用法
  • 消息队列系列二(IOT中消息队列的应用)
  • 学习JavaScript数据结构与算法 — 树
  • ​学习一下,什么是预包装食品?​
  • #NOIP 2014# day.1 T2 联合权值
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • #图像处理
  • (3)选择元素——(17)练习(Exercises)
  • (55)MOS管专题--->(10)MOS管的封装
  • (a /b)*c的值
  • (Note)C++中的继承方式
  • (阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目
  • (待修改)PyG安装步骤
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (论文阅读40-45)图像描述1
  • (十八)SpringBoot之发送QQ邮件