Spring Boot 自动配置:它是怎么"自动"的?

举报
Brian-Tony 发表于 2026/11/02 09:25:29 2026/11/02
【摘要】 Spring Boot 自动配置:它是怎么"自动"的?用 Spring Boot 最爽的体验大概就是:引入一个 starter 依赖,配几个属性,应用就能跑起来。不用像以前那样写一堆 XML 配置。但很多人只是"会用",并不清楚它到底是怎么自动装配的。今天就来拆解一下这个"魔法"。 入口:@SpringBootApplication每个 Spring Boot 项目都有一个启动类,上面标着...

Spring Boot 自动配置:它是怎么"自动"的?

用 Spring Boot 最爽的体验大概就是:引入一个 starter 依赖,配几个属性,应用就能跑起来。不用像以前那样写一堆 XML 配置。但很多人只是"会用",并不清楚它到底是怎么自动装配的。今天就来拆解一下这个"魔法"。

入口:@SpringBootApplication

每个 Spring Boot 项目都有一个启动类,上面标着 @SpringBootApplication。这个注解其实是个"三合一":

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

它由三个核心注解组成:

  • **@SpringBootConfiguration**:本质上就是 @Configuration,标记这是一个配置类。
  • **@ComponentScan**:自动扫描当前包及子包下的 @Component、@Service、@Controller 等组件。
  • **@EnableAutoConfiguration**:自动配置的核心,告诉 Spring Boot 根据 classpath 下的依赖自动装配 Bean。

自动配置的核心流程

@EnableAutoConfiguration 内部通过 @Import(AutoConfigurationImportSelector.class) 导入自动配置逻辑。大致流程如下:

  1. 扫描所有 starter 中的配置文件:Spring Boot 会读取 classpath 下所有 jar 包中的 META-INF/spring.factories(Spring Boot 2.7 之前)或 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(Spring Boot 2.7+),拿到所有候选的自动配置类。
  2. 按需加载:并不是所有候选类都会被加载,每个自动配置类上都有一堆条件注解,只有满足条件才会生效:
    • @ConditionalOnClass:classpath 中存在某个类时才生效(比如引入了 MySQL 驱动才加载数据源配置)。
    • @ConditionalOnMissingBean:用户没有自定义同类型 Bean 时才生效(用户自己配了就优先用用户的)。
    • @ConditionalOnProperty:配置文件中某个属性存在或为指定值时才生效。
    • @ConditionalOnWebApplication:只有在 Web 应用中才生效。
  3. 绑定配置属性:自动配置类会通过 @ConfigurationProperties 读取 application.yml 或 application.properties 中的配置,比如 server.port=8080、spring.datasource.url=...。

举个栗子:数据源自动配置

当你引入 spring-boot-starter-jdbc 和 MySQL 驱动后,Spring Boot 会自动配置一个 DataSource Bean。核心逻辑大致如下(简化版):

@Configuration
@ConditionalOnClass(DataSource.class)  // classpath 中有 DataSource 类
@EnableConfigurationProperties(DataSourceProperties.class) // 绑定配置属性
public class DataSourceAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean  // 用户没自定义 DataSource 时才生效
    public DataSource dataSource(DataSourceProperties properties) {
        // 根据配置创建 HikariCP / Druid 等连接池
        return properties.initializeDataSourceBuilder().build();
    }
}

对应的配置属性类:

@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties {
    private String url;
    private String username;
    private String password;
    private String driverClassName;
    // getter / setter ...
}

你在 application.yml 里写的:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: 123456

就会被自动绑定到 DataSourceProperties 中,然后用来创建数据源。

如何排查自动配置?

如果想知道哪些自动配置生效了、哪些没生效,可以在启动时加上调试参数:

debug: true

或者启动时加 JVM 参数:

-Ddebug

控制台会输出 Positive matches(生效的)和 Negative matches(未生效的)列表,非常直观。

自定义 Starter

理解了自动配置原理,你也可以自己写一个 starter。大致步骤:

  1. 创建一个自动配置类,用 @Configuration + 条件注解。
  2. 在 META-INF/spring.factories(或 .imports 文件)中注册它。
  3. 提供 xxx-spring-boot-starter 命名的 jar 包,别人引入依赖就能用。

很多公司内部的基础设施封装(比如统一日志、统一鉴权)就是这么做的。

一句话总结

  • @SpringBootApplication = @Configuration + @ComponentScan + @EnableAutoConfiguration。
  • 自动配置通过读取 spring.factories(或 .imports)拿到候选类,再用条件注解按需加载。
  • 用户自定义的 Bean 优先级高于自动配置的 Bean。
  • 开启 debug=true 可以查看自动配置的生效情况。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。