Spring Boot 项目的启动流程,图片+文字详细解答(附相关面试题)

发布时间:2026/7/17 12:41:20
Spring Boot 项目的启动流程,图片+文字详细解答(附相关面试题) 目录一. 核心简要流程二. 详细流程图三. 启动流程详解3.1 初始化阶段3.2 运行阶段四. 面试题合集4.1 Spring Boot启动流程4.2 Spring Boot 的自动配置是如何实现的4.3 如何自定义 Spring Boot 的 Banner4.4 如何监听 Spring Boot 的启动事件4.5 Spring Boot 内嵌服务器是如何启动的4.6 SpringBootApplication 注解的作用是什么4.7 Spring Boot 应用启动失败的可能原因及排查方法4.8 如何排除不需要的自动配置类一. 核心简要流程启动类初始阶段→ 创建SpringApplication→ 初始化阶段推断类型、加载配置。运行阶段→ 准备环境 → 创建上下文 → 刷新上下文加载 Bean、启动服务器→ 执行 Runner → 完成启动。二. 详细流程图其实相比于大量的文字描述图形的方式是最易于大家理解的我将 Spring Boot 的启动流程简化成了下面的一张图片通过图片更易于同学们进行理解。图片文字可能较小这里我将图片的浏览器链接发到下面有需要的小伙伴可以复制代码到浏览器查看。Online FlowChart Diagrams Editor - Mermaid Live Editor流程代码graph TD A[启动类 main 方法] -- B[创建 SpringApplication 实例] B -- C[初始化阶段] C -- C1[推断应用类型] C -- C2[加载 SpringFactories] C -- C3[设置主类] B -- D[运行阶段 run()] D -- D1[启动计时器] D1 -- D2[配置 Headless 模式] D2 -- D3[发布 ApplicationStartingEvent] D3 -- D4[准备环境 Environment] D4 -- D4a[加载配置文件 application.yml] D4 -- D4b[加载命令行参数] D4 -- D4c[发布 ApplicationEnvironmentPreparedEvent] D4 -- D5[打印 Banner] D5 -- D6[创建 ApplicationContext] D6 -- D7[初始化上下文] D7 -- D7a[调用 ApplicationContextInitializer] D7 -- D7b[发布 ApplicationContextInitializedEvent] D7 -- D8[刷新上下文 refresh()] D8 -- D8a[准备 BeanFactory] D8 -- D8b[执行 BeanFactoryPostProcessor] D8b -- D8b1[处理 Configuration 类] D8b -- D8b2[加载自动配置 AutoConfiguration] D8 -- D8c[注册 BeanPostProcessor] D8 -- D8d[初始化 MessageSource] D8 -- D8e[初始化事件广播器] D8 -- D8f[实例化单例 Bean] D8f -- D8f1[创建 Controller/Service/Repository] D8f -- D8f2[启动内嵌服务器 Tomcat/Jetty] D8 -- D8g[发布 ContextRefreshedEvent] D8g -- D9[执行 CommandLineRunner/ApplicationRunner] D9 -- D10[发布 ApplicationReadyEvent] D10 -- E[应用启动完成]不过只看图片是不够哒所以小编这里还是要进行文字说明文字结合图片相信大家对于Spring Boot 的启动流程能有一个更清晰的理解下面我们进入正题三. 启动流程详解Spring Boot 项目启动流程可以分为初始化阶段和运行阶段核心逻辑在SpringApplication.run()方法中此方法涵盖了整个运行阶段。下面我们对这两个阶段以及做了哪些事分别进行解析。3.1 初始化阶段项目初始启动会在当前工作目录下寻找带有 SpringBootApplication 注解的标识启动类并把这个类作为应用程序的入口点如果没有找到带有 SpringBootApplication 注解的标识类则会报错并打印错误信息。在初始化过程中实例对象由 SpringApplication 的构造函数进行初始化主要做一下三件事1推断应用类型根据类路径判断是 Web 应用(ServletReactive)还是普通应用。2加载 SpringFactories通过 SpringFactoriesLoader 加载 META-INF / spring.factories 文件中定义的配置类包括ApplicationContextInitializer应用上下文初始化器ApplicationListener应用事件监听器如监听启动事件。3设置主类通过StackTrace找到main方法所在的类即启动类。3.2 运行阶段找到 main 方法以后程序就会执行 main 中 run()方法 完成以下关键步骤。步骤一启动计时器主要负责记录应用启动耗时用于监控和日志输出。步骤二配置 Headless模式设置 java.awt.headless true使服务器没有显示器和鼠标也能运行。步骤三创建并发布 ApplicationStartingEvent 事件通知所有 ApplicationListener 监听器应用开始启动步骤四准备程序运行环境(Environment)读取配置加载 application.ymlapplication.properties 配置文件命令行参数系统环境变量等。读取并准备完毕后发布ApplicationEnvironmentPreparedEvent事件表明环境已准备就绪。步骤五打印 Banner显示 Spring Boot启动图标如下图所示该图标也可通过 banner.txt 文件自定义但一般很少会这样做就是啦。步骤六创建应用上下文 ApplicationContext在最开始程序初始化的时候已经判断了应用的类型然后这里就会根据应用等各类型创建对应的 ApplicationContext。Servlet应用创建 AnnotationConfigServletWebServerApplicationContextReactive 应用创建 AnnotationConfigReactiveWebServerApplicationContext普通应用创建 AnnotationConfigApplicationContext步骤七初始化应用上下文调用 ApplicationContextInitializer 对上下文进行预处理例如注册自定义 Bean。然后发布 ApplicationContextInitializedEvent 事件表明上下文初始化已完成。步骤八刷新应用上下文(核心步骤注册 Bean 对象)1准备上下文设置上下文环境(Environment)2解析配置类通过ComponentScan 扫描 Bean加载 Configuration 配置类。3执行 BeanFactoryPostProcessor 处理 PropertySource、Import 等注解。自动配置的核心加载 spring.factories 中的 AutoConfiguration 类根据条件(例如ConditionalOnClass) 动态注册 Bean。4注册 BeanPostProcessor 处理 Bean 初始化前后的逻辑(例如AOP逻辑)。5初始化消息源(MessageSource)国际化支持。6初始化时间广播器用于发布事件。7实例化单例 Bean 对象调用 finishBeanFactoryInitialization() 创建所有非懒加载的单例 Bean。8启动内嵌服务器如果是 Web 应用Spring Boot 会启动一Web 服务器例如 Tomcat、Jetty 、Undertow具体决定启动哪个服务器是通过 ServletWebServerFactoryAutoConfiguration 配置类结合 条件注解 ConditionalOnClass 动态选择的。如果类路径存在 Tomcat 类默认依赖spring-boot-starter-web包含tomcat-embed-core。则会使用 Tomcat。如果排除 Tomcat 并添加 Jetty 或 Undertow 依赖则自动切换。9完成上下文刷新发布 ContextRefreshedEvent 事件表明容器刷新事件已完成步骤九所有实现这两个接口的 Bean执行 CommandLineRunner 和 ApplicationRunner用于启动后执行自定义逻辑步骤十发布 ApplicationStartedEvent 和 ApplicationReadyEvent通知应用已完全启动四. 面试题合集4.1 Spring Boot启动流程Spring Boot 启动流程分为初始化阶段和运行阶段。初始化阶段通过SpringApplication构造函数加载配置类和推断应用类型运行阶段通过run()方法依次完成环境准备、上下文创建、Bean 加载、自动配置、启动内嵌服务器等操作。核心步骤包括读取配置、刷新上下文加载 Bean、执行 Runner 接口最终发布启动完成事件。4.2Spring Boot 的自动配置是如何实现的自动配置通过EnableAutoConfiguration注解触发其底层依赖spring.factories文件中定义的AutoConfiguration类。这些类使用Conditional注解如ConditionalOnClass、ConditionalOnMissingBean根据类路径、配置等条件动态注册 Bean。例如当类路径存在DataSource时自动配置数据源相关的 Bean。4.3如何自定义 Spring Boot 的 Banner在src/main/resources下创建banner.txt文件Spring Boot 启动时会自动读取该文件内容作为 Banner。此外可通过spring.banner.location指定自定义文件路径或通过SpringApplication.setBanner()以编程方式设置。4.4如何监听 Spring Boot 的启动事件实现ApplicationListener接口并监听特定事件例如ApplicationStartingEvent应用启动时此时 Bean 尚未加载。ApplicationReadyEvent应用完全启动后。或使用EventListener注解EventListener(ApplicationReadyEvent.class) public void onReady() { System.out.println(应用已启动); }4.5Spring Boot 内嵌服务器是如何启动的在刷新上下文时Spring Boot 会通过ServletWebServerApplicationContext的onRefresh()方法创建内嵌服务器如 Tomcat。具体步骤从类路径检测到Servlet类触发 Web 应用类型推断。通过TomcatServletWebServerFactory创建 Tomcat 实例并绑定端口。启动 Tomcat此时服务器进入监听状态。4.6SpringBootApplication注解的作用是什么它是三个注解的组合SpringBootConfiguration标记为配置类。EnableAutoConfiguration启用自动配置。ComponentScan扫描当前包及其子包的Component类。4.7Spring Boot 应用启动失败的可能原因及排查方法常见原因端口冲突检查server.port是否被占用。Bean 冲突检查是否有重复的 Bean 定义。配置错误如数据库连接信息错误。依赖缺失检查pom.xml或build.gradle是否缺少必要依赖。排查方法查看启动日志中的异常堆栈信息。启用调试模式--debug参数输出自动配置报告。使用ConditionalOnProperty或ConditionalOnMissingBean分析条件是否满足。4.8如何排除不需要的自动配置类方法一在SpringBootApplication注解中通过exclude排除SpringBootApplication(exclude {DataSourceAutoConfiguration.class}) public class Application { ... }方法二通过配置文件spring: autoconfigure: exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration