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)决定是否生效。例如:

    java 复制代码
    @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 加载实现类

    java 复制代码
    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 SPI Spring SPI
配置文件位置 META-INF/services/ META-INF/spring.factories
加载方式 ServiceLoader SpringFactoriesLoader
条件化支持 不支持 支持(结合条件注解)
典型应用场景 JDBC 驱动加载 Spring Boot 自动装配

🐮🐎

  • Spring Boot 自动装配 :基于条件注解和 spring.factories 的 SPI 机制,动态加载配置类,减少手动配置。
  • SPI 核心思想:解耦接口与实现,通过配置文件声明扩展点,实现灵活的插件化架构。
相关推荐
独泪了无痕8 小时前
Spring Data Redis 快速上手
spring boot·redis·后端
wangchunyu11410 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
paopaokaka_luck11 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
Thomas.Sir11 小时前
第9课:SpringBoot4.x Web开发基础:WebMvc自动配置、静态资源、请求参数接收
java·spring boot
程序 代码狂人11 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
m0_6399069412 小时前
Linux 操作系统入门:目录结构、服务排查常用命令、Shell 脚本基础
linux·运维·后端
2501_9445215912 小时前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github
holly就是我12 小时前
AI 编程助手为什么跑偏?用开源 ccglass 看清 Prompt、工具调用和 Token 消耗
人工智能·后端
鸿蒙开发12 小时前
共享 Schema 与 SchemaFactory
前端·后端·harmonyos
用户7884773163412 小时前
小程序后端三选一:云开发、.NET WebAPI、Node,我按客户现状分了三种答案
后端