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 文件,结构更清晰,支持按条件过滤
相关推荐
码语智行9 小时前
Spring Security自定义AuthenticationManager实现手机号/密码双认证
java·后端·spring
SuniaWang9 小时前
《AgentX 专栏》07-全链路可观测:用OpenTelemetry+Jaeger让每次AI对话都可追踪可复盘
java·人工智能·spring·架构·langchain·opentelemetry·agenx
fengxin_rou9 小时前
【从零开始的JUC并发第五章】:线程池详解
java·jvm·spring
咖啡八杯9 小时前
GoF设计模式——装饰模式
java·算法·设计模式·装饰器模式
_Aaron___9 小时前
RAG 知识库越用越脏?先把“增量更新”设计清楚
java·人工智能
飞翔中文网9 小时前
Java学习笔记之注解
java·笔记·学习
BossFriday9 小时前
【手撸IM】SycllaDB 消息存储基础
java·分布式·中间件
武子康9 小时前
Build-Your-Own-X 从零构建轻量级事件驱动微框架:嵌入式与物联网场景下的极简实践
人工智能·后端·物联网·ai·c#·大模型·嵌入式
霸道流氓气质9 小时前
导入历史跟踪机制实战指南
java·linux·服务器
日取其半万世不竭9 小时前
Uptime Kuma 应该放哪台机器?
java·docker·容器·https