✅ 一、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 会自动调用所有实现 CommandLineRunnerApplicationRunner 接口的 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。
    • 模板方法SpringApplicationrun() 方法是模板方法,封装了固定流程,子类可扩展。
    • 观察者模式:事件监听机制(如 ApplicationReadyEvent)用于解耦启动过程中的各个阶段。

💡 小记:“约定优先,自动装配,工厂+观察者,Starter 一键搞定”


🔄 三、面试“搭子”连环问预测(你可能会遇到的追问)

Q1:Spring Boot 启动时,如何判断是 Web 应用?

A:通过 WebApplicationType 枚举判断,检查 classpath 中是否存在 javax.servlet.Servletorg.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

Environment

, ApplicationContextInitializer

创建上下文

实例化 ConfigurableApplicationContext

BeanFactory

, AnnotationConfigApplicationContext

刷新上下文

Bean 扫描、实例化、依赖注入、发布事件

refresh()

, ServletWebServerInitializedEvent

执行 Runner

调用 CommandLineRunner

/ ApplicationRunner

启动后任务、数据预热

发布 Ready 事件

应用就绪,可接收请求

ApplicationReadyEvent


🧠 五、记忆口诀(面试时可默念)

“一准二建三刷新,四跑五就接客忙”

—— 一准(准备环境),二建(创建上下文),三刷新(Bean 初始化),四跑(Runner 执行),五就(Ready 事件,应用就绪)


✅ 六、建议复习方式

  1. 手写流程图:把启动步骤画成流程图,标注每个阶段的关键类和事件。
  2. 模拟面试:对着镜子或找朋友模拟回答,重点练“启动流程”和“自动配置原理”。
  3. 结合项目:把你简历里的项目拿出来,说“我在 XX 项目中用了 Spring Boot,启动时会加载 XX 配置,执行 XX Runner,用于 XX 功能”。

🎯 一句话总结

Spring Boot 启动流程 = 准备环境 → 创建容器 → 刷新 Bean → 执行 Runner → 发布 Ready 事件。

 

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐