当前位置: 首页 > 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 核心思想:解耦接口与实现,通过配置文件声明扩展点,实现灵活的插件化架构。

在这里插入图片描述

http://www.xdnf.cn/news/5365.html

相关文章:

  • 《AI大模型应知应会100篇》第23篇:角色扮演技巧:让AI成为你需要的专家
  • 【英语语法】基本句型
  • Redis面试——常用命令
  • webgl入门实例-09索引缓冲区示例
  • BH1750光照传感器---附代码
  • java + spring boot + mybatis 通过时间段进行查询
  • 【JavaScript】二十四、JS的执行机制事件循环 + location + navigator + history
  • 基于尚硅谷FreeRTOS视频笔记——13—HAL库和RTOS时钟源问题
  • UE学习记录part18
  • Java锁的分类与解析
  • LeetCode算法题(Go语言实现)_51
  • Vue3如何选择传参方式
  • C++面试
  • 【HDFS入门】HDFS核心配置与优化指南概述
  • 【Python学习笔记】Pandas实现Excel质检记录表初审、复核及质检统计
  • webgl入门实例-08索引缓冲区的基本概念
  • 杂记-LeetCode中部分题思路详解与笔记-HOT100篇-其三
  • 二分查找-LeetCode
  • 代码学习总结(三)
  • 算法5-16 对二进制字符串解码
  • 多 Agent 协作怎么整:从谷歌A2A到多Agent交互方案实现
  • STL简介(了解)
  • 【无标题】
  • Qt核心知识总结
  • 第六章:6.3求一个3*3的整型矩阵对角线元素之和
  • ESP32-idf学习(二)esp32C3作服务端与电脑蓝牙数据交互
  • 机器学习有多少种算法?当下入门需要全部学习吗?
  • vscode+keil嵌入式软件开发全流程
  • C++笔记-list
  • 【已更新】2025华中杯C题数学建模网络挑战赛思路代码文章教学数学建模思路:就业状态分析与预测