Spring Boot 启动流程真那么简单?5 步拆解 + 连环追问 你能扛到第几问?
✅ 一、Spring Boot 启动流程(面试标准答法)
面试官问:“请讲一下 Spring Boot 的启动过程?”
你可以这样回答:
Spring Boot 的启动入口是 main() 方法,调用 SpringApplication.run(YourApplication.class, args),整个过程可以拆解为以下 5 个关键阶段:
🌱 1. 准备环境(Environment 准备)
- 加载配置文件:从
application.yml/application.properties读取配置。 - 判断应用类型:是否为 Web 应用(通过检测是否存在
Servlet相关类)。 - 加载
ApplicationContextInitializer:从META-INF/spring.factories中加载并实例化,用于在上下文刷新前做自定义配置。
💡 小记:“先读配置,判断是不是 Web,再加载初始器”
🏗️ 2. 创建应用上下文(ApplicationContext)
- 实例化
ConfigurableApplicationContext(通常是AnnotationConfigApplicationContext)。 - 这一步相当于“把容器搭好”,准备接收 Bean 的定义。
💡 小记:“容器骨架搭起来”
🧩 3. 刷新上下文(Bean 初始化 + 监听事件)
- 调用
refresh()方法,完成 Bean 的扫描、实例化、依赖注入。 - 所有 Bean 初始化完成后,发布
ServletWebServerInitializedEvent(如果是 Web 项目,此时内嵌 Tomcat 已启动)。 - 监听
ContextRefreshedEvent,表示上下文已就绪。
💡 小记:“Bean 全出生,Tomcat 也跑起来”
🏃 4. 调用 CommandLineRunner / ApplicationRunner
- 在上下文刷新完成后,Spring Boot 会自动调用所有实现
CommandLineRunner或ApplicationRunner接口的 Bean。 - 通常用于执行一些启动后的一次性任务(比如数据预热、缓存加载)。
💡 小记:“跑完初始化,再执行自定义启动任务”
🎉 5. 发布 ApplicationReadyEvent
- 所有启动流程结束,应用进入“就绪状态”,可以接收外部请求。
- 发布
ApplicationReadyEvent,标志应用正式对外服务。
💡 小记:“启动完成,开始接客!”
📝 二、Spring Boot 核心理念与设计模式(面试加分项)
面试官问:“Spring Boot 为什么能自动配置?它的核心设计思想是什么?”
你可以这样回答:
Spring Boot 的核心是约定优于配置 + 自动配置 + Starter 机制。
- 自动配置:通过
@EnableAutoConfiguration注解,从META-INF/spring.factories加载自动配置类,根据 classpath 中的依赖自动配置 Bean。 - Starter 机制:比如
spring-boot-starter-web,它把常用依赖(Tomcat、Spring MVC、Jackson)打包在一起,开发者只需引入一个依赖,无需手动配置。 - 设计模式:
-
- 工厂模式:Spring 容器就是一个 Bean 工厂,通过
@ComponentScan扫描并实例化 Bean。 - 模板方法:
SpringApplication的run()方法是模板方法,封装了固定流程,子类可扩展。 - 观察者模式:事件监听机制(如
ApplicationReadyEvent)用于解耦启动过程中的各个阶段。
- 工厂模式:Spring 容器就是一个 Bean 工厂,通过
💡 小记:“约定优先,自动装配,工厂+观察者,Starter 一键搞定”
🔄 三、面试“搭子”连环问预测(你可能会遇到的追问)
Q1:Spring Boot 启动时,如何判断是 Web 应用?
A:通过 WebApplicationType 枚举判断,检查 classpath 中是否存在 javax.servlet.Servlet 或 org.springframework.web.context.ConfigurableWebApplicationContext 等类。
Q2:Spring Boot 自动配置的原理是什么?
A:通过 @EnableAutoConfiguration 注解,加载 META-INF/spring.factories 中的 AutoConfigurationImportSelector,根据条件注解(如 @ConditionalOnClass)决定是否加载某个自动配置类。
Q3:Spring Boot 启动过程中,Bean 是怎么被加载的?
A:通过 @ComponentScan 扫描所有 @Component 及其派生注解(@Service, @Controller, @Repository),然后由 BeanDefinitionRegistry 注册 Bean 定义,最后在 refresh() 阶段实例化并注入依赖。
Q4:Spring Boot 和 Spring 的区别?
A:Spring 是基础框架,需要手动配置;Spring Boot 是基于 Spring 的快速开发框架,提供自动配置、Starter、内嵌服务器、生产级监控等能力,简化开发流程。
Q5:Spring Boot 启动后,如何优雅关闭?
A:可以通过 ContextClosedEvent 监听关闭事件,或使用 @PreDestroy 注解标注销毁方法,Spring Boot 也会自动注册 shutdown hook,确保资源释放。
📚 四、你的笔记重点提炼(可背诵版)
|
阶段 |
关键动作 |
面试关键词 |
|
准备环境 |
加载配置、判断 Web、加载 Initializer |
, |
|
创建上下文 |
实例化 |
, |
|
刷新上下文 |
Bean 扫描、实例化、依赖注入、发布事件 |
, |
|
执行 Runner |
调用 / |
启动后任务、数据预热 |
|
发布 Ready 事件 |
应用就绪,可接收请求 |
|
🧠 五、记忆口诀(面试时可默念)
“一准二建三刷新,四跑五就接客忙”
—— 一准(准备环境),二建(创建上下文),三刷新(Bean 初始化),四跑(Runner 执行),五就(Ready 事件,应用就绪)
✅ 六、建议复习方式
- 手写流程图:把启动步骤画成流程图,标注每个阶段的关键类和事件。
- 模拟面试:对着镜子或找朋友模拟回答,重点练“启动流程”和“自动配置原理”。
- 结合项目:把你简历里的项目拿出来,说“我在 XX 项目中用了 Spring Boot,启动时会加载 XX 配置,执行 XX Runner,用于 XX 功能”。
🎯 一句话总结:
Spring Boot 启动流程 = 准备环境 → 创建容器 → 刷新 Bean → 执行 Runner → 发布 Ready 事件。
更多推荐

所有评论(0)