Spring Boot 自动配置与 Starter

笔记/Java/Spring 全家桶/Spring Boot/Spring Boot 自动配置与 Starter

本专题导航#

主题
上一篇配置与多环境
本篇自动配置与 Starter
下一篇Web、运维与测试
入门与启动

背景与动机#

「为什么只加依赖就能用 Redis、Web、JPA?」——答案是 Starter + 自动配置。这是 Spring Boot 面试最高频的原理题,本篇单独讲清链路。

核心原理拆解#

1. Starter 是什么#

把一组功能相关依赖与默认配置打包,避免手工拼 jar、解决版本冲突。常用示例:

Starter作用
spring-boot-starter-webWeb + 内嵌 Tomcat + Jackson
spring-boot-starter-data-redisRedis
spring-boot-starter-jdbc / mybatis-spring-boot-starter数据访问
spring-boot-starter-actuator监控端点

引入 Starter 后,可通过 application.yml 覆盖默认配置。

2. 自动配置原理#

启动时 @EnableAutoConfiguration 触发 AutoConfigurationImportSelector,读取 classpath 中:

  • Boot 2.7 及以前META-INF/spring.factories
  • Boot 3.xMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

列出候选自动配置类,再按 条件注解 决定是否注册 Bean,例如:

  • @ConditionalOnClass:classpath 有某类才生效
  • @ConditionalOnMissingBean:容器里没有该 Bean 才创建默认 Bean
  • @ConditionalOnProperty:配置开关控制

因此:有依赖 + 满足条件 → 自动装配;不需要的功能可排除。

3. 排除自动配置#

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })

或配置:

spring:
autoconfigure:
exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

4. 依赖管理:parent 与 BOM#

  1. 继承 spring-boot-starter-parent:统一插件与依赖版本
  2. 或 import spring-boot-dependencies BOM:只管理版本,不继承 parent

两者都能避免 Spring 生态 jar 版本打架。

5. 热部署#

方式说明
spring-boot-devtools开发时 classpath 变更自动重启(类加载器隔离)
Spring Loaded / JRebel商业/增强热替换
模板引擎Thymeleaf 等可配置模板热加载

devtools 仅用于开发,不要打进生产包。

常见陷阱与错误示例#

1. 排除自动配置后仍引入对应 Starter#

排除了 DataSourceAutoConfiguration 却仍引入 spring-boot-starter-jdbc,可能仍有 Bean 冲突或多余依赖,需理清 classpath。

2. 多个 Starter 引入重复功能#

例如同时引入多套 Web 或日志实现,易冲突;以 parent/BOM 统一管理为准。

3. 以为自动配置一定会生效#

条件不满足时(缺类、已有自定义 Bean、配置关闭),对应自动配置会跳过,表现为「加了依赖没 Bean」——查条件注解与日志 DEBUG 自动配置报告。

面试高频问题#

完整 30 道速查见 Spring Boot 面试题 30 道

一句话总结#

Starter 管依赖与默认配置,自动配置管按条件注册 Bean;理解 spring.factories / imports + @Conditional* 就能答清大部分原理题。

文章目录

文章目录