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 小时前
Hermes 教程 03:Skills 系统
android·java·数据库
starsky762381 小时前
spring boot——前后端分离
java·spring boot·后端
jiayong231 小时前
IDEA 中进行分支双向同步操作指南
java·ide·intellij-idea
AI玫瑰助手1 小时前
Python流程控制:for循环遍历字符串列表字典
android·java·python
java修仙传1 小时前
Java 实习日志:一次报价规则适配、列表规则精简与导入校验修复
java·实习
萨小耶1 小时前
[Java学习日记07】聊聊接口和抽象类
java·开发语言·学习
战南诚1 小时前
Flask中的URL ——url_for() 与 自定义动态路由过滤器
后端·python·flask
折哥的程序人生 · 物流技术专研1 小时前
《Java面试85题图解版(三)》上篇:高阶架构设计篇
java·开发语言·后端·面试·职场和发展
吴声子夜歌1 小时前
Java——ArrayDeque
java·arraydeque