spring boot 4

一、自动配置核心原理

SpringBoot 的自动配置,本质是遵循 "约定大于配置",通过条件注解 + 自动配置类,在启动时自动将符合条件的 Bean 注入到 IOC 容器中。

1. 触发入口:@SpringBootApplication

启动类上的 @SpringBootApplication 是自动配置的入口,它组合了三个核心注解:

  • @SpringBootConfiguration:标记为配置类
  • @ComponentScan:组件扫描
  • @EnableAutoConfiguration:自动配置开关(核心)

2. @EnableAutoConfiguration 如何工作?

该注解内部通过 @Import(AutoConfigurationImportSelector.class) 导入了自动配置选择器,核心流程如下:

  1. 读取配置文件AutoConfigurationImportSelector 会读取 spring-boot-autoconfigure 模块中 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件(SpringBoot 2.7+ 版本,旧版本为 spring.factories),文件中定义了所有自动配置类的全限定名。
  2. 过滤自动配置类 :根据条件注解(如 @ConditionalOnClass@ConditionalOnMissingBean)筛选符合当前环境的自动配置类。
  3. 加载并注册 Bean :将符合条件的自动配置类加载到 Spring 容器中,其中通过 @Bean 定义的 Bean 会被自动注册。

3. 示例:DispatcherServlet 自动配置

当引入 spring-boot-starter-web 依赖时:

  • 自动配置类 DispatcherServletAutoConfiguration 被加载
  • 该类上标注了 @ConditionalOnClass(DispatcherServlet.class),只有项目中存在 DispatcherServlet 类时,配置才生效
  • 配置类中通过 @Bean 定义了 DispatcherServlet,启动时自动注入到 IOC 容器中

二、自定义 Starter 实现公共组件自动配置

在实际开发中,可将公共组件封装为 Starter,让其他项目直接引入即可使用,无需手动配置。

1. 场景与结构

以自定义 MyBatis Starter 为例,Starter 分为两个模块:

表格

模块 作用
dmybatis-spring-boot-autoconfigure 提供自动配置逻辑,定义 Bean 注册规则
dmybatis-spring-boot-starter 依赖管理模块,仅引入 autoconfigure 模块,简化依赖引入

2. 实现步骤

步骤 1:创建 autoconfigure 模块,编写自动配置类

java

运行

复制代码
@Configuration
public class CommonConfig {
    // 示例:根据配置文件条件注册 Bean
    @Bean
    @ConditionalOnProperty(prefix = "country", name = {"name", "system"})
    public Country country(@Value("${country.name}") String name, 
                           @Value("${country.system}") String system) {
        return new Country(name, system);
    }

    @Bean
    public Province province() {
        return new Province();
    }
}
步骤 2:创建自动配置入口类

java

运行

复制代码
@AutoConfiguration
@Import(CommonConfig.class)
public class CommonAutoConfig {
}
步骤 3:配置自动配置加载文件

autoconfigure 模块的 resources/META-INF/spring/ 目录下,创建 org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件,写入自动配置类的全限定名:

text

复制代码
cn.itcast.config.CommonAutoConfig
步骤 4:创建 starter 模块,引入 autoconfigure 依赖

starter 模块的 pom.xml 中仅引入 autoconfigure 模块:

xml

复制代码
<dependency>
    <groupId>cn.itcast</groupId>
    <artifactId>dmybatis-spring-boot-autoconfigure</artifactId>
    <version>1.0.0</version>
</dependency>

3. 其他项目使用自定义 Starter

只需在项目中引入 starter 依赖,即可自动加载 CommonAutoConfig 中的配置,无需手动 @Import

xml

复制代码
<dependency>
    <groupId>cn.itcast</groupId>
    <artifactId>dmybatis-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>

三、核心总结

  1. 自动配置的本质 :通过 @EnableAutoConfiguration + AutoConfigurationImportSelector 读取配置文件中的自动配置类,结合条件注解筛选后注册 Bean。
  2. 自定义 Starter 关键
    • 分为 autoconfigure(配置逻辑)和 starter(依赖管理)两个模块
    • autoconfigure 中通过 AutoConfiguration.imports 文件声明自动配置类
    • 利用条件注解控制 Bean 的注册时机
  3. 优势:封装公共组件,简化其他项目的配置流程,实现 "开箱即用"。

💡 常见问题:SpringBoot 2.7 前后自动配置文件的变化

  • 2.7 版本前:使用 META-INF/spring.factories 文件
  • 2.7 版本后:使用 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件,结构更清晰,支持按条件过滤
相关推荐
凌虚7 分钟前
面向 MySQL 用户的 PostgreSQL 快速上手指南
数据库·后端·架构
都叫我大帅哥31 分钟前
Java JJWT 完全指南:从入门到生产级实践
java
IT_陈寒1 小时前
Vite静态资源引用这个坑我踩得有点疼
前端·人工智能·后端
前端开发张小七2 小时前
Java 学习笔记 · 第一课:基础语法与核心概念
java·后端
海盗12342 小时前
微软技术周报 ——2026-08-03
后端·python·microsoft·c#·.netcore
沙湖遇雨2 小时前
6. Pipeline 的生命周期
后端
青青子衿悠悠我心2 小时前
TRAE Work让财务月底对账3小时变5分钟
后端
创安电气研究所2 小时前
用TypeScript给Modbus设备做一层适配器
后端
妙码生花2 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(五十):增加管理员角色组管理
前端·后端·ai编程
妙码生花3 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(五十一):管理员和角色组的关联
前端·后端·ai编程