欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > Spring Boot 启动原理(SpringApplication.run(...) 流程)

Spring Boot 启动原理(SpringApplication.run(...) 流程)

2025/9/14 15:07:45 来源:https://blog.csdn.net/weixin_60819193/article/details/148628861  浏览:    关键词:Spring Boot 启动原理(SpringApplication.run(...) 流程)

一、Spring Boot 启动原理(SpringApplication.run(...) 流程)

  1. 创建 SpringApplication 实例

    • SpringApplication.run(…) 首先根据传入的主启动类(带有 @SpringBootApplication 注解的类)构造一个 SpringApplication 对象。

    • 在构造过程中,会收集环境(Environment)、监听器(ApplicationListener)、初始器(ApplicationContextInitializer)等。

  2. 准备环境(Environment)

    • 通过 ConfigFileApplicationListener 加载配置文件(application.properties / application.yml),并把它们解析进 Environment

    • 支持多种配置源(命令行参数、系统环境变量、配置文件、Spring Cloud 配置中心等),并按照优先级合并。

  3. 发布事件:ApplicationStartingEvent

    • 在真正创建 ApplicationContext 之前,先发布一个“启动开始”事件,供用户或框架中其他组件监听。

  4. 创建并配置 ApplicationContext

    • 根据应用类型(Web 应用:AnnotationConfigServletWebServerApplicationContext;非 Web:AnnotationConfigApplicationContext),实例化对应的 ApplicationContext

    • EnvironmentResourceLoaderApplicationArguments 等注入上下文。

    • 调用所有注册的 ApplicationContextInitializer,允许用户在上下文刷新前做手动调整。

  5. 注册 Bean 定义

    • 扫描启动类及其子包下所有带注解的组件(@Component, @Service, @Controller…)

    • 加载自动配置:

      • 利用 spring.factories 中的 EnableAutoConfiguration 条目,通过 AutoConfigurationImportSelector 找到所有可能的自动配置类

      • 条件注解(@ConditionalOnClass@ConditionalOnMissingBean…)决定哪些自动配置会真正生效

  6. 刷新(context.refresh()

    • 完整地解析并实例化所有 Bean,执行 Bean 后处理器(BeanPostProcessor)、事件发布(ContextRefreshedEvent)等钩子

    • 如果是 Web 应用,会启动内嵌的 Servlet 容器(Tomcat/Jetty/Undertow)

  7. 运行回调

    • 所有注册的 ApplicationRunnerCommandLineRunner 会被依次调用,执行用户自定义的启动逻辑

  8. 完成启动

    • 发布 ApplicationReadyEvent,标志应用已准备就绪开始接收请求;

    • Spring Boot 会保持运行,直到收到关闭信号或调用 context.close()

流程图

对比

讲的步骤图中对应模块/步骤
1. new SpringApplication() 构造【黄色区域】“构造函数”
2. 加载 Environment(配置文件、属性源)“加载属性资源”→“创建配置环境”
3. 调用各类 Initializer & Listener 注册“init 加载初始化器”→ “设置所有可用应用程序监听器”→getRunListeners(args)
4. 打印 Banner“打印 banner 图案”(step3)
5. 创建并准备好 ApplicationContext“上下文创建”(step6.1 根据类型创建 web/standard 上下文)
6. 调用 prepareContext(步骤7、8、10)“准备上下文并加载资源”(step7、step8、step10)
7. 执行 refreshContext“上下文刷新 refreshContext”(step9)
8. afterRefresh & 发布事件“上下文后置处理 afterRefresh”→“发布应用上下文启动完成”
9. 执行 Runner(ApplicationRunner/CommandLineRunner)“执行 Runner 逻辑”(step13)

简而言之:

  • 黄色区域 对应我说的“准备阶段”(构造、加载配置、注册监听器/初始化器);

  • 红色区域 对应“运行阶段”(打印 Banner、创建/刷新 Spring 容器、发布事件、最后执行 Runner)。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词