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

Springboot 自动装配原理是什么?SPI 原理又是什么?


1. Spring Boot 自动装配原理

自动装配是 Spring Boot 简化配置的核心机制,其核心思想是根据类路径中的依赖自动配置 Spring 应用

关键步骤:
  1. 启动注解 @SpringBootApplication
    该注解组合了 @EnableAutoConfiguration,用于激活自动配置。

  2. 加载自动配置类

    • Spring Boot 启动时,AutoConfigurationImportSelector 类会扫描所有 JAR 包中的 META-INF/spring.factories 文件。
    • 在该文件中,键 org.springframework.boot.autoconfigure.EnableAutoConfiguration 列出了所有自动配置类的全限定名。
  3. 条件化加载配置类
    自动配置类使用条件注解(如 @ConditionalOnClass@ConditionalOnMissingBean)决定是否生效。例如:

    @Configuration
    @ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
    public class DataSourceAutoConfiguration {// 当类路径存在 DataSource 时,自动配置数据源
    }
    
  4. 自动注册 Bean
    满足条件的配置类会向 Spring 容器注册 Bean,无需手动编写 XML 或 Java 配置。

核心机制总结:
  • spring.factories 文件:定义自动配置类的清单。
  • 条件注解:根据环境动态决定是否加载配置。
  • SpringFactoriesLoader:Spring 提供的 SPI 实现,用于加载配置类。

2. SPI 原理

SPI 是一种服务发现机制,允许第三方为接口提供实现,实现解耦。Java 原生 SPI 和 Spring 的 SPI 类似但实现方式不同。

Java 原生 SPI
  1. 定义接口
    例如 JDBC 的 java.sql.Driver 接口。
  2. 提供服务实现
    META-INF/services/ 下创建以接口全限定名命名的文件,内容为实现类名:
    com.mysql.cj.jdbc.Driver
    
  3. 通过 ServiceLoader 加载实现类
    ServiceLoader<Driver> drivers = ServiceLoader.load(Driver.class);
    

缺点:无法按需加载、不支持条件化配置。


Spring 的 SPI 机制

Spring 扩展了 SPI 机制,通过 META-INF/spring.factories 文件实现更灵活的扩展

  1. 定义扩展点
    Spring Boot 的自动配置、监听器、初始化器等均通过 SPI 扩展。
  2. 配置实现类
    spring.factories 中指定键值对,例如:
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.example.MyAutoConfiguration
    
  3. 通过 SpringFactoriesLoader 加载
    Spring 内部使用 SpringFactoriesLoader.loadFactoryNames() 加载配置类。

优势:支持批量加载、结合条件注解实现动态装配。


对比总结

特性Java SPISpring SPI
配置文件位置META-INF/services/META-INF/spring.factories
加载方式ServiceLoaderSpringFactoriesLoader
条件化支持不支持支持(结合条件注解)
典型应用场景JDBC 驱动加载Spring Boot 自动装配

🐮🐎

  • Spring Boot 自动装配:基于条件注解和 spring.factories 的 SPI 机制,动态加载配置类,减少手动配置。
  • SPI 核心思想:解耦接口与实现,通过配置文件声明扩展点,实现灵活的插件化架构。

在这里插入图片描述

相关文章:

  • 【PGCCC】Postgres MVCC 内部:更新与插入的隐性成本
  • Selenium 获取 Web 页面信息的全指南
  • 【补充篇】Davinci工具要求的dbc格式
  • FortiAI 重塑Fortinet Security Fabric全面智能化进阶
  • ECharts散点图-散点图8,附视频讲解与代码下载
  • 解锁智能制造:PLC远程下载如何让设备运维效率提升10倍?
  • 【C++ Qt】Hello World、初始信号槽、理解对象树 ~~~(通俗易懂 图文并茂)
  • Prometheus thanos架构
  • 【HDFS入门】HDFS高可用性与容错机制深度解析
  • 正则表达式在爬虫中的应用:匹配 HTML 和 JSON 的技巧
  • YOLOv12即插即用---RFAConv
  • 3DS 转 STL 全攻略:传统工具与迪威模型网在线转换深度解析
  • 自动驾驶系列—GLane3D: Detecting Lanes with Graph of 3D Keypoints
  • 2025.04.16【GroupedandStackedbarplot】生信数据可视化技法
  • R语言之环境清理
  • eclipse常用快捷键
  • FreeRTOS二值信号量详解与实战教程
  • kafka发送消息,同时支持消息压缩和不压缩
  • 比较UNION ALL与WITH ROLLUP
  • 函数返回const引用,使用const修饰变量接收
  • 离休干部周惠梅逝世,曾从事多年地下革命工作
  • 俄罗斯哈巴罗夫斯克市首次举办“俄中论坛”
  • 中国戏剧梅花奖终评结果公示,蓝天、朱洁静等15名演员入选
  • 总书记回信二周年之际,上海如何将垃圾分类深度融入城市发展?
  • 美国恶劣天气已造成至少28人死亡
  • 江苏疾控:下设部门无“病毒研究所”,常荣山非本单位工作人员