SpringBoot 完整启动原理
SpringBoot 启动核心分为两大块主类SpringBootApplication注解组合能力SpringApplication.run()完整启动流程包含环境准备、上下文创建、自动配置、Bean 扫描、内嵌容器启动等步骤。下面分层梳理逻辑清晰、贴合面试答题节奏。一、先讲核心注解 SpringBootApplication该注解是复合注解等价三个注解合并Configuration EnableAutoConfiguration ComponentScanConfiguration标记当前类为配置类允许内部Bean定义对象交给 Spring 容器管理。ComponentScan默认扫描当前主类所在包及其所有子包下带Controller/Service/Repository/Component的类自动注册 Bean 到 IOC 容器。EnableAutoConfigurationSpringBoot 核心开启自动装配 底层通过Import(AutoConfigurationImportSelector)读取META-INF/spring.factories文件中预定义的自动配置类 根据项目引入的依赖 jar、条件注解ConditionalOnClass、ConditionalOnMissingBean按需自动创建 Bean无需手动 XML 配置。补充还有AutoConfigurationPackage把主包注册为自动配置扫描根路径。二、主入口SpringApplication.run (主类.class, args)run 方法分为两大阶段实例化 SpringApplication 对象执行 run 启动流程阶段 1new SpringApplication () 实例化做 4 件初始化工作记录主启动类sources推断应用类型存在 Servlet 相关类 → WEB 应用内嵌 Tomcat/Jetty/Undertow无 Web 依赖 → 普通标准 Java 应用加载META-INF/spring.factories中两类扩展点ApplicationContextInitializer容器上下文初始化器ApplicationListener全局事件监听器设置资源加载器、主类推断标记。阶段 2run () 核心 10 步启动流程面试核心流程public ConfigurableApplicationContext run(String... args) { // 1. 创建StopWatch记录启动耗时 StopWatch stopWatch new StopWatch(); stopWatch.start(); ConfigurableApplicationContext context null; CollectionSpringBootExceptionReporter exceptionReporters; // 2. 设置系统属性开启java.awt.headless无头模式 configureHeadlessProperty(); // 3. 获取并启动SpringApplicationRunListeners启动监听器 SpringApplicationRunListeners listeners getRunListeners(args); listeners.starting(); try { ApplicationArguments applicationArguments new DefaultApplicationArguments(args); // 4. 准备环境加载配置文件yml/properties、命令行参数、系统环境变量 ConfigurableEnvironment environment prepareEnvironment(listeners, applicationArguments); configureIgnoreBeanInfo(environment); // 打印Banner启动图案 Banner printedBanner printBanner(environment); // 5. 根据应用类型创建对应ApplicationContext容器 context createApplicationContext(); // 6. 执行ApplicationContextInitializer初始化上下文 prepareContext(context, environment, listeners, applicationArguments, printedBanner); // 7. 刷新容器核心Spring IOC完整初始化流程 refreshContext(context); // 8. 后置处理容器扩展逻辑 afterRefresh(context, applicationArguments); stopWatch.stop(); // 打印启动耗时日志 if (this.logStartupInfo) { new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch); } // 9. 发布容器启动完成事件 listeners.started(context); // 执行ApplicationRunner、CommandLineRunner自定义启动任务 callRunners(context, applicationArguments); } catch (Throwable ex) { // 异常处理触发故障监听器 handleRunFailure(context, ex, exceptionReporters, listeners); throw new IllegalStateException(ex); } try { // 发布应用就绪事件代表服务完全启动完成 listeners.running(context); } catch (Throwable ex) { handleRunFailure(context, ex, exceptionReporters, null); throw new IllegalStateException(ex); } return context; }逐段提炼关键步骤启动监听器 starting发布 ApplicationStartingEvent项目刚启动还未加载环境。准备环境 prepareEnvironment加载多来源配置优先级命令行参数 系统环境变量 application.yml/application.properties 默认配置 发布 ApplicationEnvironmentPreparedEvent。创建上下文 createApplicationContextweb 环境创建AnnotationConfigServletWebServerApplicationContext普通应用创建AnnotationConfigApplicationContext。上下文前置准备 prepareContext绑定环境到容器、注册主启动类为配置类、执行所有 ApplicationContextInitializer发布 ApplicationContextInitializedEvent。refreshContext () 刷新 IOC 容器最核心内部执行 Spring 原生 refresh () 整套流程加载所有配置类组件扫描 ComponentScan注册业务 Bean 定义执行自动装配加载 META-INF/spring.factories 自动配置类BeanFactory 后置处理、Bean 定义解析实例化单例 Bean、依赖注入、初始化PostConstruct、InitializingBeanWEB 环境下创建内嵌 Tomcat 容器并启动绑定端口监听请求。afterRefresh 容器后置扩展空方法可自定义重写做扩展。发布 started 事件 执行启动 Runner发布 ApplicationStartedEvent 执行ApplicationRunner/CommandLineRunner适合项目启动后加载缓存、初始化数据。发布 running 事件发布 ApplicationReadyEvent代表服务完全就绪可以接收请求。三、关键核心机制补充面试加分1. 自动装配原理完整闭环EnableAutoConfiguration导入AutoConfigurationImportSelector从 classpath 下META-INF/spring.factories读取 key 为EnableAutoConfiguration的所有配置类全限定名通过条件注解ConditionalOnXXX判断导入了对应依赖才生效没有对应 Bean 才自动创建配置类内部通过Bean自动装配如 DataSource、RedisTemplate、DispatcherServlet 等组件。2. 内嵌 Web 容器启动逻辑如果是 Web 应用refresh () 流程中会触发ServletWebServerApplicationContext的 onRefresh 方法自动探测 classpath 存在的 web 容器Tomcat 默认创建内嵌 Server 工厂生成 Tomcat 实例注册 SpringMVC 的 DispatcherServlet 到 Tomcat启动容器绑定 server.port 端口接收 HTTP 请求。 SpringBoot 无需外部 Tomcat打包 jar 可直接运行根源就在这里。3. 事件监听机制观察者模式全流程通过事件驱动Starting → EnvironmentPrepared → ContextInitialized → Started → Ready 开发者可自定义 ApplicationListener 监听对应事件做扩展。四、精简口述总结版SpringBoot 启动分为注解基础和 run 执行流程主类SpringBootApplication整合配置、包扫描、自动装配三大能力SpringApplication.run 分为实例初始化、环境加载、容器创建、刷新 IOC、启动内嵌容器、执行启动 Runner核心 refresh 方法完成 Bean 扫描、自动配置加载、Bean 实例化依赖注入自动装配读取 spring.factories 文件依靠条件注解按需创建组件Web 环境自动启动内嵌 Tomcat整套流程零 XML简化 Spring 繁琐配置。

相关新闻

C++生产者消费者模型:从互斥锁到线程安全队列的实战实现

C++生产者消费者模型:从互斥锁到线程安全队列的实战实现

1. 项目概述:当生产者与消费者模型遇上职场现实最近在整理一些并发编程的笔记,突然觉得教科书里那个经典的“生产者与消费者”问题,简直是为我们这行量身定做的绝佳比喻。想想看,一个项目里,疯狂输出需求、变更和想法的…

2026/7/18 4:46:08阅读更多 →
RK3588音频开发实战:libmedia API从入门到精通

RK3588音频开发实战:libmedia API从入门到精通

在RK3588开发板上进行音频应用开发时,很多开发者会遇到从命令行工具到编程接口的过渡难题。libmedia作为Rockchip平台的重要音频处理库,其API使用方式与传统的ALSA直接调用有显著差异。本文将基于实际项目经验,详细介绍RK3588平台libmedia音频…

2026/7/18 4:41:08阅读更多 →
TRAE与UI/UX Pro Max Skill:AI设计工具安装与配置指南

TRAE与UI/UX Pro Max Skill:AI设计工具安装与配置指南

1. 认识TRAE与UI/UX Pro Max SkillTRAE作为新一代AI编程工具,正在改变开发者与设计者的工作方式。它通过智能体(Skill)系统扩展核心功能,而UI/UX Pro Max Skill正是其中最受欢迎的设计辅助工具之一。这个Skill由NextLevelBuilder团队开发,已在…

2026/7/18 4:41:08阅读更多 →
AI Skills:大语言模型的能力扩展包

AI Skills:大语言模型的能力扩展包

1. 为什么说Skills是AI时代的APP?十年前我们下载APP是为了让手机具备新功能,如今给AI安装Skills也是同样的逻辑。Skills本质上是一组预设的工作流和知识模板,它们教会大语言模型如何完成特定任务。就像APP扩展了智能手机的能力边界一样&#…

2026/7/18 5:46:13阅读更多 →
Python 脚本如何打包成 EXE:PyInstaller 基本语法、常用参数、资源依赖与交付验证

Python 脚本如何打包成 EXE:PyInstaller 基本语法、常用参数、资源依赖与交付验证

🔥个人主页:杨利杰YJlio❄️个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》 《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更…

2026/7/18 5:46:13阅读更多 →
人形机器人技术解析:从运动控制到AI决策的三大核心挑战与应用前景

人形机器人技术解析:从运动控制到AI决策的三大核心挑战与应用前景

1. 从“玩具”到“伙伴”:人形机器人为何成为科技巨头必争之地最近几年,如果你关注科技新闻,会发现一个有趣的现象:无论是特斯拉的Optimus,还是波士顿动力的Atlas,亦或是国内众多科技公司发布的概念机&…

2026/7/18 5:46:13阅读更多 →
《超简单:用 Python 让 Excel 飞起来》读书笔记:9.2.1 通过命令创建文件并调用 Python 自定义函数

《超简单:用 Python 让 Excel 飞起来》读书笔记:9.2.1 通过命令创建文件并调用 Python 自定义函数

🔥个人主页:杨利杰YJlio❄️个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》 《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更…

2026/7/18 5:46:13阅读更多 →
QT串口通信中C++20协程实现循环发送与状态控制

QT串口通信中C++20协程实现循环发送与状态控制

1. 项目概述:当QT串口遇上C20协程最近在做一个工控上位机的项目,核心需求之一就是通过串口与下位机(比如PLC、单片机)进行稳定可靠的数据通信。其中有一个典型的场景:需要周期性地向设备发送查询指令,比如每…

2026/7/18 5:46:13阅读更多 →
山西夏令营怎么选?一位家长的真实体验与选择心得

山西夏令营怎么选?一位家长的真实体验与选择心得

暑假临近,不少家长开始为孩子假期安排发愁:孩子沉迷手机、作业无人辅导、假期生活单调无趣。面对市场上种类繁多的山西夏令营,如何选择适合孩子的项目成为许多家庭的共同难题。本文基于一位家长的实际参与经历,分享选择山西夏令营…

2026/7/18 5:41:12阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/17 10:42:55阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/17 8:31:03阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/17 13:22:23阅读更多 →
从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

更多请点击: https://kaifayun.com 第一章:从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则 在Claude驱动的产品需求文档(PRD)生成实践中,原始业务意图往往以自然语言片…

2026/7/18 0:00:14阅读更多 →
Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

更多请点击: https://codechina.net 第一章:Cursor配置生成失效?3大隐藏陷阱4行修复代码,资深工程师连夜整理的紧急补救清单 Cursor 配置生成突然失效,是近期高频报障场景。表面看是 cursor.config.json 未更新或 LSP…

2026/7/18 0:00:14阅读更多 →
某智驾大牛创业

某智驾大牛创业

作者:钟声编辑:Mark出品:红色星际头图:智能驾驶图片据悉,国内某头部智驾公司端到端模型技术大牛Z投身创业,并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈,更是业内…

2026/7/18 0:00:14阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/17 22:48:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/17 13:22:38阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/17 17:26:50阅读更多 →