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 文件,结构更清晰,支持按条件过滤
相关推荐
geovindu15 分钟前
CSharp: Bridge Pattern
开发语言·后端·桥接模式·结构型模式
霸道流氓气质18 分钟前
SpringBoot中设计模式组合使用示例-策略、模板、观察者、门面、工厂、单例。
spring boot·后端·设计模式
货拉拉技术20 分钟前
复杂业务规则太多?我们搭了一个规则可视化配置平台
后端
爱勇宝1 小时前
AI 都能写代码了,还要学计算机吗?
前端·后端·程序员
cfm_29141 小时前
Spring监听器
java·spring boot·后端
逝水无殇1 小时前
C# 特性详解
开发语言·后端·c#
cfm_29141 小时前
SpringBoot 数据库全栈整合
数据库·spring boot·后端
xn71331 小时前
别再把 MCP Roots 当安全沙箱:一个符号链接就能逃逸目录
人工智能·后端·mcp
SamDeepThinking1 小时前
Java面向对象在JVM里怎么实现
java·后端·面试
学以智用1 小时前
HTTP 请求头 Headers 完整详解
前端·后端