本专题导航
| 篇 | 主题 |
|---|---|
| 上一篇 | 配置与多环境 |
| 本篇 | 自动配置与 Starter |
| 下一篇 | Web、运维与测试 |
| 入门与启动 |
背景与动机
「为什么只加依赖就能用 Redis、Web、JPA?」——答案是 Starter + 自动配置。这是 Spring Boot 面试最高频的原理题,本篇单独讲清链路。
核心原理拆解
1. Starter 是什么
把一组功能相关依赖与默认配置打包,避免手工拼 jar、解决版本冲突。常用示例:
| Starter | 作用 |
|---|---|
spring-boot-starter-web | Web + 内嵌 Tomcat + Jackson |
spring-boot-starter-data-redis | Redis |
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.x:
META-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.DataSourceAutoConfiguration4. 依赖管理:parent 与 BOM
- 继承
spring-boot-starter-parent:统一插件与依赖版本 - 或 import
spring-boot-dependenciesBOM:只管理版本,不继承 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* 就能答清大部分原理题。