当前位置: 首页 > 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机制有助于更好地使用和扩展现有框架。
http://www.lryc.cn/news/392007.html

相关文章:

  • CPU的核心数和线程数
  • 电脑游戏录屏,3款实用软件推荐给你
  • C#桌面应用开发:番茄定时器
  • PHP智慧门店微信小程序系统源码
  • SerDes介绍以及原语使用介绍(2)OSERDESE2原语仿真
  • 【稳定检索/投稿优惠】2024年教育、人文发展与艺术国际会议(EHDA 2024)
  • Docker拉取失败,利用 Git将 Docker镜像重新打 Tag 推送到阿里云等其他公有云镜像仓库里
  • 【区分vue2和vue3下的element UI Breadcrumb 面包屑组件,分别详细介绍属性,事件,方法如何使用,并举例】
  • gdb调试命令大全
  • ESP32之arduino环境安装及点灯
  • 查看VUE中安装包依赖的版本号
  • 博途通讯笔记1:1200与1200之间S7通讯
  • Kafka搭建(集群版)
  • 【康复学习--LeetCode每日一题】3115. 质数的最大距离
  • 【yolov8系列】ubuntu上yolov8的开启训练的简单记录
  • Scala学习笔记15: 文件和正则表达式
  • 外卖员面试现状
  • 异步加载与动态加载
  • MUNIK解读ISO26262--什么是DFA
  • 启动spring boot项目停止 提示80端口已经被占用
  • SOLIDWORKS分期许可(订阅形式),降低前期的投入成本!
  • 详细分析Spring Boot 数据源配置的基本知识(附配置)
  • 海思SD3403/SS928V100开发(15)9轴IMU ICM-20948模块SPI接口调试
  • 大力出奇迹:大语言模型的崛起与挑战
  • 【算法 - 哈希表】两数之和
  • 【深度学习】图形模型基础(5):线性回归模型第一部分:认识线性回归模型
  • 2024 年第十四届 APMCM 亚太地区大学生数学建模竞赛B题超详细解题思路+数据预处理问题一代码分享
  • Yarn有哪些功能特点
  • 深度学习算法bert
  • PyTorch - 神经网络基础