2026吃透 Spring Boot:入门到精通实战全路线,源码 + 项目 + 面试题一次打通
如果你正在准备 Java 面试,或者刚学完 SSM 但发现投简历没人看,那问题大概率不是 Java 基础不够,而是你缺一条能落地的 Spring Boot 主线路。现在网上的教程有两个极端:要么是“点一下运行出 Hello World”的入门课,要么是“上来就甩一堆源码行号”的劝退文。真正稀缺的是那种能把源码、实战和面试题串成一条线的内容。
这次我们来看一条适合 2026 年 Java 开发者参考的 Spring Boot 学习路径:从环境和项目搭建开始,到自动配置源码主线、Spring Boot 单元测试、常见场景实战,再到面试题解析,最后落到一条能反复迭代的个人项目主线上。这套路线的目标只有一个——让你学完的东西能写进简历、能在面试里讲清楚、能经得住追问。
整个路线围绕 4 个核心关键词展开:Spring Boot、Java、源码、实战面试。不是让你去背八股文,而是让你能对着一个真实项目讲出“为什么 Spring Boot 这么设计”以及“这个配置失效时怎么排查”。
1. 核心学习路线能力速览
| 能力项 | 说明 |
|---|---|
| 目标人群 | 已掌握 Java 基础、Servlet/JSP 或 SSM 基础,准备系统学习 Spring Boot 的开发者 |
| 学习目标 | 独立搭建 Spring Boot 项目,能完成常见业务模块开发,能读懂自动配置源码主线 |
| 核心知识点 | 自动配置、Starter 机制、Spring MVC、数据访问、单元测试、部署运维 |
| 源码阅读主线 | SpringApplication 启动流程、@SpringBootApplication、自动配置、条件注解 |
| 实战项目类型 | 预约服务平台、WebSocket 实时通信、前后端分离接口、定时任务、文件上传 |
| 面试题方向 | 启动流程、自动配置原理、Bean 生命周期、事务失效、循环依赖、过滤器拦截器区别 |
| 建议学习周期 | 20 到 30 天,每天 2 到 3 小时即可走通主线 |
| 适用框架版本 | Spring Boot 2.7.x / 3.x,建议从 2.7.x 起步再看 3.x 差异 |
2. 适用场景与学习边界
这条路线对应的是真实工作中的 4 类高频场景:快速搭建 REST API、整合数据库并管理事务、实现 WebSocket 或消息推送、编写单元测试与接口联调。换句话说,你的能力范围会被拉到“能独立交付一个后端模块”的级别。
使用边界也很清楚。这套路线不解决前端问题,不做大厂算法题突击,不是“三天精通”的速成课,更不建议你绕过 Java 基础和 MySQL 基础直接开啃。如果你连”HashMap 和 Hashtable 的区别“都说不清楚,直接看 Spring Boot 源码多半会卡在反射和代理部分。这里有一个务实判断:源码可以晚点看,但实战必须当天上手。
还有版权和安全边界要提醒:你拿来做练习的接口数据、爬虫数据、用户资料,必须保证有合法授权;教程里如果用到了第三方开源项目,注意遵守其开源协议;不要把学习项目直接部署到公网去跑真实生产数据。
3. Spring Boot 本地开发环境准备
3.1 操作系统与软件清单
Spring Boot 是纯 Java 项目,跨平台,Windows、macOS、Linux 都能跑。新手建议直接用 Windows 或 macOS,生产环境再看 Linux 部署。前置软件有以下几项:
| 软件 | 用途 | 备注 |
|---|---|---|
| JDK | 编译运行 | Spring Boot 2.x 需要 JDK 8/11,3.x 需要 JDK 17+ |
| Maven | 依赖管理 | 建议 3.6 以上版本,配置好阿里云镜像 |
| IDEA | 集成开发环境 | 社区版够用,企业版体验更好 |
| MySQL | 数据存储 | 练习阶段用 MySQL 8.0 |
| Redis | 缓存与分布式场景 | 按需安装,先不装也不影响主线 |
| Postman | 接口测试 | 或直接用 IDEA 自带 HTTP Client |
3.2 JDK 版本选择建议
从实际使用来看,Spring Boot 3.x 已经非常普及,但如果你的项目参考代码以 2.x 为主,初期用 2.7.x 起步更稳。JDK 建议装两个版本:一个 JDK 8 跑旧项目,一个 JDK 17 跑新项目。IDEA 里可以配置多版本 SDK 切换,不影响日常使用。
检查环境的命令:
java -version mvn -version git --version3.3 Maven 镜像配置
Maven 默认从中央仓库拉依赖,慢还容易断,建议修改settings.xml配置国内镜像:
<mirror> <id>aliyunmaven</id> <mirrorOf>central</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>注意:不建议使用任何绕过网络限制的手段,国内镜像已经足够满足学习与开发需要。
4. Spring Boot 项目创建与服务启动
4.1 使用 IDEA 创建项目
IDEA 中新建项目时选择 Spring Initializr。如果你使用的是 IDEA 2023 以上版本,创建界面会直接提供 Spring Boot 版本 、语言、类型、JDK 等选项。选择 Java 语言,构建工具选 Maven,打包方式看个人习惯,Jar 即可。
关键一条:第一次创建的依赖不要贪多,只选 Spring Web 就够了。先跑起来,再逐步加依赖。这样能避免大量不可控的依赖冲突。
4.2 最小项目结构
一个 Spring Boot 基础项目大概长这样:
spring-boot-demo/ ├── pom.xml └── src/main/java/com/example/demo/ ├── DemoApplication.java └── controller/ └── HelloController.javaDemoApplication.java是启动类:
package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }这里最值得注意的就是@SpringBootApplication。它是一个组合注解,很多人在面试中被问“Spring Boot 为什么能自动配置”,答案的入口就在这里。
4.3 启动与访问验证
写一个测试接口:
package com.example.demo.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @GetMapping("/hello") public String hello() { return "Hello Spring Boot"; } }启动DemoApplication主方法,控制台出现“Started DemoApplication”后,浏览器访问http://localhost:8080/hello,看到“Hello Spring Boot ”就说明最小项目跑通了。
补充一点:如果你本机 8080 端口被占,可以在application.properties里改端口:
server.port=80815. Spring Boot 核心源码主线阅读
这是整个路线中最硬核也最容易被劝退的部分。我的建议是:不要从头到尾读源码,按主线去追,只看 5 个关键节点。
5.1 主线一:SpringApplication 启动流程
从DemoApplication的main方法进去,第一站是SpringApplication.run()。这一行代码解决的核心问题是:一个 Java 应用是怎么变成 Spring 容器的。
阅读时可以按下面顺序查看关键方法:
SpringApplication.run(Class<?> primarySource, String... args)new SpringApplication(primarySource)构造过程run()方法中createApplicationContext()创建容器refreshContext()刷新容器
面试时不用背行号,但你要能描述清楚:Spring Boot 启动时会做环境准备、创建 ApplicationContext、执行 BeanFactoryPostProcessor、注册 BeanPostProcessor、初始化消息源和事件广播器、执行 onRefresh、注册监听器、调用 runners。
建议用一张手绘图梳理调用链,比看十篇源码分析都有效。
5.2 主线二:@SpringBootApplication 组合注解
@SpringBootApplication等于以下三个注解的组合:
@SpringBootConfiguration:标明这是一个配置类。@EnableAutoConfiguration:开启自动配置,这是源码阅读的重难点。@ComponentScan:启动包扫描,默认扫描启动类所在包及其子包。
这里有个高频面试点:为什么启动类要放在最外层包?因为@ComponentScan默认扫描的是启动类所在包。如果你把 Controller 放在启动类的兄弟目录,肯定扫描不到。
5.3 主线三:EnableAutoConfiguration 自动配置
进入@EnableAutoConfiguration后,关键在AutoConfigurationImportSelector。它会读取spring.factories或AutoConfiguration.imports里注册的自动配置类列表,再逐一校验条件。
实际源码主线可以这样追:
@EnableAutoConfiguration导入AutoConfigurationImportSelectorgetCandidateConfigurations()拿到候选配置类- 通过
@Conditional条件注解筛选,按需生效 - 通过
AutoConfigurationImportEvent事件通知监听器
不需要读完整列表,只需要抽 3 个典型自动配置类精读,比如:
DataSourceAutoConfiguration:数据源自动配置WebMvcAutoConfiguration:Spring MVC 自动配置HttpMessageConvertersAutoConfiguration:消息转换器
5.4 主线四:条件注解与 Bean 加载
Spring Boot 自动配置的灵魂是条件注解。你在源码里会频繁看到以下注解,面试也必考:
| 注解 | 作用 |
|---|---|
@ConditionalOnClass | 类路径存在某个类才生效 |
@ConditionalOnMissingBean | 容器中没有某个 Bean 才生效 |
@ConditionalOnProperty | 配置项满足条件才生效 |
@ConditionalOnWebApplication | Web 应用环境下才生效 |
判断一个配置是否生效,最直接的方式是打开 debug 日志:
debug=true启动后控制台会输出“Positive matches”和“Negative matches”,一眼看出哪些自动配置没生效以及原因。这个技巧一定要学会,面试答“你如何排查自动配置不生效”时非常加分。
6. Spring Boot 实战模块搭建与功能验证
源码看完就要落到代码上。下面给出一个能反复练手的预约服务项目原型。这类项目在真实场景中很常见,比如上门烹饪预约、婚庆服务预约等,核心业务都是“用户创建预约、服务方接单、订单状态流转”。我们不需要做完整平台,只要把核心模块拆出来练手。
6.1 项目依赖配置
pom.xml中加入常用依赖:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies>6.2 配置文件
src/main/resources/application.yml:
server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/reservation?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: your_password driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update show-sql: true6.3 实体与 Repository
预约实体类:
package com.example.demo.entity; import jakarta.persistence.*; import java.time.LocalDateTime; @Entity @Table(name = "reservation") public class Reservation { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String customerName; private String phone; private String serviceType; private LocalDateTime reservationTime; private Integer status; // 省略 getter / setter }Repository 接口:
package com.example.demo.repository; import com.example.demo.entity.Reservation; import org.springframework.data.jpa.repository.JpaRepository; public interface ReservationRepository extends JpaRepository<Reservation, Long> { }6.4 Controller 层设计
package com.example.demo.controller; import com.example.demo.entity.Reservation; import com.example.demo.repository.ReservationRepository; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/api/reservations") public class ReservationController { private final ReservationRepository reservationRepository; public ReservationController(ReservationRepository reservationRepository) { this.reservationRepository = reservationRepository; } @PostMapping public Reservation create(@RequestBody Reservation reservation) { reservation.setStatus(0); return reservationRepository.save(reservation); } @GetMapping public List<Reservation> list() { return reservationRepository.findAll(); } @GetMapping("/{id}") public Reservation detail(@PathVariable Long id) { return reservationRepository.findById(id).orElse(null); } }6.5 功能验证流程
- 启动 MySQL,创建
reservation数据库。 - 启动 Spring Boot 项目,观察日志确认数据源初始化完成。
- 用 Postman 发送 POST 请求:
curl -X POST http://localhost:8080/api/reservations \ -H "Content-Type: application/json" \ -d "{\"customerName\":\"张三\",\"phone\":\"13800138000\",\"serviceType\":\"SERVICE_A\",\"reservationTime\":\"2026-05-01T10:00:00\"}"- 返回 JSON 中包含
id和status=0,表示创建成功。 - 依次测试查询列表和详情接口。
排查要点:如果返回 500,优先看控制台有没有 SQL 报错;如果ddl-auto: update没有自动建表,检查数据库连接地址和账号权限。
7. Spring Boot 单元测试与接口测试
标题里提到了“实战”和“面试题解析”,单元测试正好是两个都占的模块。Spring Boot 对测试支持很完善,写接口后立即补测试是工程化的基础习惯。
7.1 使用 @SpringBootTest 做启动测试
package com.example.demo; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class DemoApplicationTests { @Test void contextLoads() { } }这个测试验证的是 Spring 容器能否正常创建。如果你在类加载、Bean 注入阶段有错误,这个测试会直接失败。
7.2 MockMvc 接口测试
下面是一个通过 MockMvc 测接口的例子:
package com.example.demo.controller; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @SpringBootTest @AutoConfigureMockMvc class ReservationControllerTest { @Autowired private MockMvc mockMvc; @Test void shouldReturnReservationList() throws Exception { mockMvc.perform(get("/api/reservations") .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.length()").isNumber()); } }7.3 测试隔离思路
测试不要依赖本地数据库数据。两种方式你可以都掌握:
- 使用 H2 内存数据库,测试数据与开发环境隔离。
- 使用 Spring 的
@Transactional注解改写测试方法,结束后回滚。
两种方法都会在面试中被问到,尤其是第二种,能答出“事务回滚保证测试数据不污染”是加分项。
8. Spring Boot 接口 API 与实时通信扩展
预约类项目做多了,你会发现接口设计只是起点,下一层是实时通知。比如用户下单后,管理员页面要立刻显示新预约,这就涉及 WebSocket。
8.1 引入 WebSocket 支持
在项目里引入依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>8.2 配置 WebSocket 端点
package com.example.demo.config; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/ws").setAllowedOriginPatterns("*").withSockJS(); } @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.enableSimpleBroker("/topic"); registry.setApplicationDestinationPrefixes("/app"); } }如果你被问到“Spring Boot 集成 WebSocket”或者“后端如何主动推送消息”,这个配置就是最标准的回答路径:注册 STOMP 端点,配置消息代理,然后通过SimpMessagingTemplate向/topic或/queue推送。
8.3 批量消息推送示例
import org.springframework.messaging.simp.SimpMessagingTemplate; @Service public class NotificationService { private final SimpMessagingTemplate messagingTemplate; public NotificationService(SimpMessagingTemplate messagingTemplate) { this.messagingTemplate = messagingTemplate; } public void notifyNewReservation(String message) { messagingTemplate.convertAndSend("/topic/reservations", message); } }实际项目里可考虑把这套消息推送做成独立模块,兼顾接口服务与实时推送。
9. Spring Boot 资源占用与性能观察
很多初学者只看功能跑通,不看资源占用和线程行为,这其实给自己埋了坑。面试答“你做过 Spring Boot 调优吗”时,能把下面几个观察手段讲清楚,比背一堆参数强得多。
9.1 观察线程与堆内存
启动项目时加上 JVM 参数:
java -jar -Xms256m -Xmx512m -Dserver.port=8080 demo-0.0.1-SNAPSHOT.jar用jvisualvm或 IDEA 自带 Profiler 观察:
- 堆内存曲线是否平滑。
- 线程数量是否有突刺。
- GC 频繁程度。
9.2 观察接口响应时间
可以用最简单的curl -w方式:
curl -o /dev/null -s -w "time_total: %{time_total}s\n" http://localhost:8080/api/reservations要压测,再用 ApacheBench 或 JMeter。压测时不要一上来就 1000 并发,从 10、50、100 并发逐步加,观察错误率和 RT 变化。
9.3 常见性能瓶颈
- 数据库连接池耗尽。
- JPA 懒加载产生 N+1 问题。
- Controller 内做了耗时 I/O 导致 Tomcat 线程阻塞。
- 未配置合适的连接池参数。
- 大量大对象请求导致 GC 频繁。
这些点每个都能扩展成一道面试题,实战项目里建议挨个亲手制造一次问题再修复,体会远比看书深。
10. Spring Boot 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 启动后自动配置的 Bean 不存在 | 条件注解未满足 | 开启 debug=true 看 Negative matches | 检查依赖或配置项 |
| 接口返回 404 | Controller 包不在扫描范围 | 检查启动类包位置、@RequestMapping | 调整包结构或加扫包 |
| 数据库连接失败 | 密码错误、数据库未启动、驱动版本不匹配 | 看控制台堆栈第一行 | 核对 URL、用户名密码,更换合适驱动依赖 |
| JPA 懒加载报 LazyInitializationException | 事务外访问懒加载属性 | 查看调用栈 | 改用 DTO 或开启事务 |
| POST 请求中文乱码 | 编码配置不一致 | 检查响应头 Content-Type 和数据库编码 | 统一 UTF-8 |
| 提示 OutOfMemoryError: Insufficient Memory | JVM 内存太小或 GC 参数不合理 | jvisualvm 查看堆、线程、GC日志 | 调整 -Xmx、排查内存泄漏 |
| WebSocket 连接不上 | 端口被占用、端点路径写错、跨域拦截 | 检查前端连接地址与后端日志 | 修改端口或配置 allowed origins |
| Maven 依赖下载失败 | 仓库连接不稳定 | 检查 settings.xml 与仓库 URL | 使用国内镜像并清理本地仓库缓存 |
这里的每一行都是实际开发中容易遇到的问题。别小看这些排查套路,它们比单纯背“Spring Boot 特性”更能证明你的实战能力。
11. Spring Boot 实战学习最佳实践
11.1 分清“读代码”和“抄代码”
看源码的时候需要精读,但写代码时不要照抄。更好的做法是:读一段自动配置源码,就把一个配置类复现成自己的 Starter;看一个接口,就自己写一个同功能的版本,不参考原文。
11.2 保持一套最小可运行配置
在项目根目录维护一个config/application-dev.yml和config/application-prod.yml,把数据源地址、Redis 地址、日志级别、缓存策略都做成可切换的配置。任何一次代码改动都要在本地跑通,再考虑部署。
11.3 模块化与目录规范
推荐包结构:
com.example.demo ├── common/ # 通用返回、异常处理、工具类 ├── config/ # 自动配置、WebMvc、WebSocket、安全等配置 ├── controller/ # 接口层 ├── service/ # 业务层,接口 + 实现 ├── repository/ # 数据访问层 ├── entity/ # 实体或领域对象 └── dto/ # 入参出参对象这种结构不是标准答案,但它的优势在于职责清晰,面试时也能一句话讲完。
11.4 认真对待 Commit 信息
每次改动做一次有意义的提交,Commit Message 写清楚“改了什么、为什么改”。这既是个人存档,也是面试时向面试官展示工程习惯的最好证据。
11.5 重视单元测试
不要只写contextLoads一个空测试。至少给核心业务接口补 MockMvc 测试,给部分工具类补纯函数测试,给事务边界补回滚测试。这些测试在面试时比“我写过 XX 商城”更有说服力。
12. 常见面试题解析与表达建议
下面这些题是 Spring Boot 面试中出现频率最高的。每道题我都会给出一个可以直接参考的回答骨架,但不建议背诵原文,要改成自己的表达。
12.1 Spring Boot 启动流程是什么?
参考骨架:Spring Boot 启动的核心是SpringApplication.run()方法。它经历几个阶段:准备环境、创建 ApplicationContext、注册 BeanDefinition、执行 BeanFactoryPostProcessor、初始化剩余单例 Bean、执行 ApplicationRunner。在自动配置部分,会引入AutoConfigurationImportSelector加载候选配置,并用条件注解过滤。
真正出彩的回答不是背流程,而是接着说出“我在项目里通过debug=true看 Negative matches 排查过一个配置不生效的问题”。
12.2 Spring Boot 自动配置的原理?
回答关键点:@EnableAutoConfiguration引入AutoConfigurationImportSelector,它读取候选配置列表,然后用条件注解过滤。你不需要把某个配置类的方法名背下来,但必须能把“条件注解”这四个字讲透,最好能现场举一个@ConditionalOnMissingBean的例子。
12.3 Spring Boot 的 Starter 是什么?
参考回答:Starter 是一组依赖描述,遵循“约定优于配置”。引入一个 Starter 相当于同时引入功能所需依赖和对应自动配置,让开发者不需要手写一堆 Bean 定义。如果面试官继续问“你自定义过 Starter 没有”,就照下面的实战小节做一遍再回答。
12.4 过滤器和拦截器的区别?
高频题。主要区别有:过滤器是 Servlet 层面的,在 Spring MVC 之前执行,依赖 Servlet 容器;拦截器是 Spring MVC 层面的,可以访问 Handler 和 ModelAndView。过滤器适合做编码处理、跨域等,拦截器适合做登录校验、权限控制。实战中通常在WebMvcConfigurer里注册拦截器,并设置excludePathPatterns放行登录接口。
12.5 Spring Boot 接口幂等性怎么做?
常见方案:利用数据库唯一索引、引入 Redis 的 SETNX、状态机校验。预约服务里典型场景是用户重复提交预约,可以在创建前先查 Redis key,如果存在则拒绝重复请求;或者用唯一订单号约束。
这类题没有标准代码,但你能结合项目给出失败重试的处理流程,面试官会更认可。
13. 自定义一个简易 Starter 实战
如果你要把 Spring Boot 源码理解变成真正的能力,建议做一个自定义 Starter。这一步非常提升综合能力,也很好突出求职差异化。
13.1 创建自动配置类
package com.example.helloautoconfigure; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @ConditionalOnProperty(prefix = "hello.demo", name = "enabled", havingValue = "true", matchIfMissing = true) public class HelloAutoConfiguration { @Bean @ConditionalOnMissingBean public HelloService helloService() { return new HelloService(); } }13.2 注册自动配置
在src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中写入:
com.example.helloautoconfigure.HelloAutoConfiguration13.3 使用 Starter
在业务项目pom.xml中加入该依赖,然后在配置文件中控制开关:
hello.demo.enabled=trueController 里注入:
@Autowired private HelloService helloService;这样做完一轮,你相当于亲手复刻了一个简化版的 Spring Boot 自动配置机制。面试提问时你能拿出这个项目说“我做过一个自定义 Starter”,比背十篇源码分析都有说服力。
14. 总结:这条路径怎么执行最有效
Spring Boot 学习的关键不是“刷完多少集视频”,而是把源码、实战、测试、部署、面试串成闭环。第一条路线的执行顺序是这样:
- 第 1 到 3 天:搭好环境,跑通项目,看懂启动流程,把核心配置过一遍。
- 第 4 到 10 天:精读自动配置源码,配合 debug 模式看条件注解命中情况。
- 第 11 到 18 天:做预约服务实战项目,覆盖 Controller、Service、Repository、WebSocket、事务。
- 第 19 到 22 天:补单元测试、接口测试、压测,整理性能观察报告。
- 第 23 到 28 天:把项目文档、SQL 脚本、部署脚本整理好,复盘面试题,查漏补缺。
中途最容易踩的坑有三个:一是源码阅读贪多,建议每个主线只看 30 分钟就转去代码;二是不写测试,建议每个模块完成后立刻补测试;三是不做文档记录,建议用 Markdown 记录每次启动、排查、调优的过程,面试前能直接拿来做复盘。
如果你能做到“能对着自己的项目把自动配置、事务失效、Bean 生命周期、过滤器拦截器区别讲清楚”,那 Spring Boot 这条主线就已经扎实了。后面再看 Spring Cloud 也好、微服务也好,都是在已有能力上的增量扩展。
建议把这条路线收藏备用。先从第一行代码开始,打开 IDEA,新建一个 Spring Boot 项目,跑通之后再回头理解源码,你会比“只顾看视频不动手”的人快很多。