Spring Boot 核心理念与快速上手
定位:01篇,讲透 Boot 解决的痛点、三大核心理念、最小应用搭建、@SpringBootApplication 的分解与工程结构
适用版本:Spring Boot 3.x(JDK 17+)
目录
- [一、Boot 解决的问题](#一、Boot 解决的问题)
- 二、核心理念
- 三、快速上手
- [四、@SpringBootApplication 分解](#四、@SpringBootApplication 分解)
- 五、工程结构与多环境
- 六、总结
- 七、常见高频面试题
一、Boot 解决的问题
Spring Framework 强大但"重",长期存在四大痛点:
| 痛点 | 表现 |
|---|---|
| 配置繁琐 | XML 或注解样板配置量大,每接一个组件一堆配置 |
| 依赖管理 | 版本冲突需手动协调,"依赖地狱"常见 |
| 部署复杂 | 传统要打 war 部署到外部 Tomcat |
| 整合成本高 | 接入数据源、缓存、MQ 各自一套配置 |
Boot 的定位不是"新的框架",而是让 Spring 开箱即用的脚手架 + 默认约定,底层仍是 Spring Framework。
二、核心理念
三大支柱支撑"约定大于配置":
2.1 自动配置(Auto-Configuration)
按 classpath 依赖和已有 Bean,智能推断并装配默认 Bean。引入 spring-boot-starter-web 就自动配好 DispatcherServlet、内嵌 Tomcat、JSON 转换------你什么都不写也能跑。原理深讲在 02篇。
2.2 起步依赖(Starter)
一个坐标引入一组版本协调的依赖:
spring-boot-starter-web
└── 内含 Spring MVC、内嵌 Tomcat、Jackson、校验等,版本由 Boot 统一仲裁
价值:不操心版本兼容;依赖树由 Boot 的依赖管理(BOM)保证一致。
2.3 内嵌容器 + 可执行 jar
把 Servlet 容器(Tomcat/Undertow)打进 jar ,java -jar app.jar 直接运行,契合容器化部署(Docker 里一个进程一个应用)。
三、快速上手
最小 Web 应用:
xml
<!-- pom.xml 关键依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.x.x</version>
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
java
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
@RestController
class HelloController {
@GetMapping("/hello")
String hello() { return "Hello, Spring Boot"; }
}
运行 main():内嵌 Tomcat 启动、监听 8080、/hello 可访问------没有任何 XML、没有外部容器。
四、@SpringBootApplication 分解
这是最高频的考点,它是一个组合注解:
@SpringBootApplication
├── @SpringBootConfiguration → 本质 @Configuration,标记这是配置类
├── @EnableAutoConfiguration → 开启自动配置(BT-02 核心)
└── @ComponentScan → 扫描【启动类所在包及子包】
两个推论:
- 启动类位置决定扫描范围:启动类应放在根包,业务类在其子包,否则 @Component 扫不到(常见"Bean 没注册"根因);
- 三个能力可拆开单独定制:如
@ComponentScan(basePackages=...)改扫描范围。
五、工程结构与多环境
5.1 标准布局
src/main/java
└── com.example.app
├── App.java ← 启动类(根包)
├── controller/ service/ repository/
src/main/resources
├── application.yml ← 主配置
├── application-dev.yml 等 ← 环境配置
├── static/ ← 静态资源
└── templates/ ← 模板
打包:spring-boot-maven-plugin 生成可执行 fat jar(含所有依赖与内嵌容器)。
5.2 多环境
profile:application-{profile}.yml + 激活(spring.profiles.active / 环境变量)。典型:dev(本地)/ test / prod,差异收敛在配置文件,不进业务代码。
六、总结
- 定位:Boot 是 Spring 的开箱即用脚手架,不是新框架;解决配置繁琐、依赖冲突、部署复杂、整合成本高四大痛点。
- 三大支柱:自动配置(按依赖智能装配)、起步依赖(版本协调)、内嵌容器(java -jar 直跑)。
- 最小应用:starter-web + @SpringBootApplication + 一个 Controller,main() 即起。
- 组合注解:@SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan;启动类位置决定扫描范围。
- 工程结构:启动类在根包,配置按 profile 分,打成可执行 fat jar。
七、常见高频面试题
1. Spring Boot 和 Spring 的关系?Boot 解决了什么问题?
要点:Boot 不是新框架,是构建在 Spring Framework 之上的脚手架,提供开箱即用能力。解决四大痛点:配置繁琐(样板多)、依赖管理(版本冲突)、部署复杂(需外部容器)、整合成本高(每组件一套配置)。底层机制仍是 Spring 的 IoC/AOP/事务,Boot 通过自动配置、起步依赖、内嵌容器把这些默认化、约定化。
2. Spring Boot 的核心理念(三大支柱)是什么?
要点:① 自动配置------按 classpath 依赖和已有 Bean 智能推断装配默认组件,约定大于配置;② 起步依赖(Starter)------一个坐标引入一组版本协调的依赖,配合 Boot BOM 统一仲裁版本,避免依赖地狱;③ 内嵌容器 + 可执行 jar------Servlet 容器打进 jar,java -jar 直接运行,契合容器化部署。三者共同实现"最少配置快速启动"。
3. @SpringBootApplication 包含哪些注解?各自作用?
要点:组合注解,含三个------@SpringBootConfiguration(本质 @Configuration,标记配置类)、@EnableAutoConfiguration(开启自动配置,触发加载候选配置类)、@ComponentScan(扫描启动类所在包及子包注册组件)。推论:启动类必须放根包,否则业务组件扫不到;需要定制时可拆开单独使用(如指定 basePackages)。
4. 为什么启动类的位置很重要?
要点:@SpringBootApplication 内置的 @ComponentScan 默认扫描启动类所在包及其子包。若启动类放错位置(如在某个子包),其它包下的 @Component/@Service/@Controller 扫描不到,表现为"Bean 未注册/找不到依赖"。规范是启动类放应用根包,业务代码组织在其子包下;确需扫描其它路径时显式配置 basePackages。
5. 什么是 Starter?有什么好处?
要点:Starter 是一组相关依赖的聚合坐标(如 spring-boot-starter-web 含 MVC、内嵌 Tomcat、Jackson、校验),引入一个即可获得整套能力。好处:① 版本协调------由 Boot 依赖管理(BOM/parent)统一仲裁,避免冲突;② 简化声明------不用逐个找依赖和版本;③ 语义清晰------按能力命名。官方提供大量 starter,也可自定义(BT-03)。
6. Spring Boot 如何实现"不需要外部 Tomcat"?
要点:内嵌容器机制。starter-web 引入内嵌 Tomcat(或可选 Undertow)依赖,Boot 自动配置在应用启动时创建并启动内嵌 Servlet 容器,把 Spring MVC 的 DispatcherServlet 注册进去。打包为可执行 jar 后 java -jar 直接运行。这改变了"应用部署进容器"的传统模型,变为"容器随应用走",契合 Docker/微服务。
7. fat jar 是什么?如何生成的?
要点:可执行 fat(uber)jar 把应用类、所有依赖、内嵌容器打成一个 jar,用 java -jar 直接运行。由 spring-boot-maven-plugin(或 Gradle 插件)的 repackage 目标生成:在标准 jar 基础上按 Boot 特定布局重组(依赖放 BOOT-INF/lib,应用类放 BOOT-INF/classes,加自定义 Manifest 指定启动类与 Boot 启动器)。这种布局由专门的 JarLauncher 加载。
8. Spring Boot 如何做依赖版本管理?
要点:两种主要方式。① 继承 spring-boot-starter-parent:获得默认配置、插件管理与依赖仲裁;② 不继承时用 import spring-boot-dependencies(BOM),只获得版本仲裁不引入父 POM 的默认。两者都由 Boot 预先测试过一组协调版本,显式指定版本可覆盖。这避免了多依赖版本冲突的"依赖地狱"。
9. 多环境配置怎么管理?
要点:利用 profile。主配置 application.yml + 环境专属 application-{profile}.yml(如 dev/test/prod),通过 spring.profiles.active(配置文件/环境变量/JVM -D)激活,环境专属值覆盖主配置。差异收敛在配置文件,不进业务代码;敏感配置(密码/密钥)不入库,走环境变量或配置中心。生产激活入口收敛到部署系统。
10. 一个 @RestController 从启动到能响应请求,经历了什么?
要点:main() 运行 SpringApplication.run → 创建 ApplicationContext 并刷新(refresh)→ 组件扫描发现 @RestController 注册为 Bean → 自动配置装配内嵌 Tomcat 与 DispatcherServlet → 注册 HandlerMapping(把 URL 映射到 @GetMapping 方法)→ 容器启动监听端口。请求到来时 DispatcherServlet 路由到对应方法,返回值经消息转换器(Jackson)序列化为 JSON 响应。
