news 2026/5/5 19:03:46

springboot 启动原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
springboot 启动原理

一、SpringBoot 启动核心流程总结

  1. 入口:SpringApplication.run()
  2. 构造SpringApplication
  3. 通过SpringApplicationRunListeners发布启动事件
  4. 准备Environment(加载配置、yml/properties)
  5. 创建ApplicationContext容器
  6. 核心:refresh() 容器(扫描、注册Bean、实例化、启动Web服务器)
  7. 发布ApplicationStartedEvent
  8. 执行ApplicationRunner/CommandLineRunner
  9. 发布ApplicationReadyEvent,启动完成

二、Mermaid 流程图(可直接复制渲染)

main 方法调用
SpringApplication.run()

new SpringApplication()

推断应用类型
Servlet/Reactive/NONE

加载 SpringFactories
ApplicationContextInitializer、ApplicationListener

执行 run 方法主体

获取 SpringApplicationRunListeners
开始广播事件

发布 ApplicationStartingEvent

准备 Environment
加载application.yml/bootstrap/系统属性

发布 ApplicationEnvironmentPreparedEvent

创建 ApplicationContext
注解配置Web容器

发布 ApplicationContextInitializedEvent

prepareContext 准备上下文
加载source、执行初始化器

发布 ApplicationPreparedEvent

【核心】refreshContext 刷新容器

invokeBeanFactoryPostProcessors 扫描Bean

registerBeanPostProcessors

实例化单例Bean

onRefresh 启动Web服务器
Tomcat/Undertow/Jetty

refresh 完成

发布 ApplicationStartedEvent

执行 ApplicationRunner、CommandLineRunner

发布 ApplicationReadyEvent

启动完成,接收请求


三、逐阶段源码级讲解

1. 入口 run()

publicstaticConfigurableApplicationContextrun(Class<?>primarySource,String...args){returnnewSpringApplication(primarySource).run(args);}

2. 构造 SpringApplication

  • 推断 Web 应用类型
  • META-INF/spring.factories加载:
    • ApplicationContextInitializer
    • ApplicationListener

3. SpringApplicationRunListeners 事件调度

这是启动“ lifecycle 管家”,依次发布:

  • ApplicationStartingEvent
  • ApplicationEnvironmentPreparedEvent
  • ApplicationPreparedEvent
  • ApplicationStartedEvent
  • ApplicationReadyEvent

4. Environment 准备

加载:

  • 系统变量
  • 命令行参数
  • application.yml/application.properties
  • 激活 profile

5. 创建 ApplicationContext

  • Web 应用:AnnotationConfigServletWebServerApplicationContext
  • 非 Web:AnnotationConfigApplicationContext

6.核心:refresh()(最重要)

@Overridepublicvoidrefresh()throwsBeansException,IllegalStateException{super.refresh();}

内部关键步骤:

  1. 扫描包、解析 BeanDefinition
  2. 实例化单例 Bean
  3. 执行onRefresh()→ 启动 Tomcat/Undertow
  4. 完成 IoC 初始化

7. 启动完成

  • 执行 Runner
  • 发布 Ready 事件
  • 服务可以对外提供访问

四、SpringApplicationRunListeners 与事件关系

SpringApplicationRunListeners

ApplicationStartingEvent

ApplicationEnvironmentPreparedEvent

ApplicationPreparedEvent

ApplicationStartedEvent

ApplicationReadyEvent

@EventListener
监听处理

L2

L3

L4

L5


五、面试满分一句话总结

SpringBoot 启动就是:
通过 SpringApplication 准备环境、创建容器、利用 SpringApplicationRunListeners 在生命周期各阶段发布事件,最终通过 refresh() 完成 IoC 初始化并启动 Web 服务器,最后执行 Runner 并发布就绪事件。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 21:14:24

Langfuse汉化实战:解决Docker卷挂载失效,让Next.js应用实时更新代码

Langfuse汉化实战&#xff1a;破解Docker卷挂载失效的Next.js热更新困局 当你在深夜的显示器前反复刷新浏览器&#xff0c;却发现修改过的前端代码像被施了魔法一样毫无变化——这种挫败感&#xff0c;每个使用Docker部署Next.js应用的开发者都深有体会。本文将以Langfuse汉化过…

作者头像 李华
网站建设 2026/4/17 3:48:27

15MW海上风机开源仿真模型:从理论到工程实践的技术革新

15MW海上风机开源仿真模型&#xff1a;从理论到工程实践的技术革新 【免费下载链接】IEA-15-240-RWT 15MW reference wind turbine repository developed in conjunction with IEA Wind 项目地址: https://gitcode.com/gh_mirrors/ie/IEA-15-240-RWT 你是否曾面临这样的…

作者头像 李华
网站建设 2026/4/15 21:12:11

2025届必备的降AI率助手推荐榜单

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 将维普系统针对 AI 生成内容的识别机制考虑进来&#xff0c;要降低 AI 检测率就得从文本特征…

作者头像 李华