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 文件,结构更清晰,支持按条件过滤
相关推荐
葫芦和十三1 小时前
图解 MongoDB 09|explain 再读:从 queryPlanner 到 executionStats
后端·mongodb·agent
葫芦和十三1 小时前
图解 MongoDB 10|覆盖查询:让索引把活干完,根本不用回表
后端·mongodb·agent
大鸡腿同学3 小时前
从 CoT 思维链到 ReAct:智能 Agent 到底是怎么 “思考” 的?
后端
IT_陈寒5 小时前
Vite的静态资源打包让我熬夜到三点,这坑千万别跳
前端·人工智能·后端
小bo波5 小时前
使用Thread子类创建线程 VS 使用Runnable接口创建线程的区别
java·多线程·thread·并发编程·runnable
SamDeepThinking6 小时前
高并发场景下,CompletableFuture与ForkJoinPool该如何取舍?
java·后端·面试
Asize6 小时前
多模态生图:从 Vite 工程化到前端调用 Qwen Image
javascript·人工智能·后端
java小白小6 小时前
SpringBoot(09):缓存实战——穿透、雪崩、击穿的解决方案
后端
java小白小6 小时前
SpringBoot(08):Redis 集成——5 分钟给你的项目加上缓存
后端
LiuMingXin6 小时前
意图与代码之间:AI编程范式全景解读
前端·后端·面试