当前位置: 首页 > article >正文

Spring Boot 启动流程详解

Spring Boot 是一个简化的 Spring 应用开发框架,它以 “约定优于配置” 的理念,为开发者提供了开箱即用的功能。在 Spring Boot 的运行过程中,SpringApplication.run() 方法是整个启动流程的核心,本文将详细剖析其内部实现,帮助你深入理解 Spring Boot 的启动机制。


目录

  1. Spring Boot 启动的主要步骤
  2. 核心组件解析
    • 环境准备
    • 上下文创建
    • Bean 加载与初始化
    • 自动配置
  3. 生命周期事件
  4. 启动异常处理机制
  5. 总结

1. Spring Boot 启动的主要步骤

Spring Boot 的启动由 SpringApplication.run() 方法驱动,其核心代码如下:

SpringApplication.run(Application.class, args);

这个方法的运行过程可以分为以下主要步骤:

  1. 初始化 SpringApplication
    确定应用类型(Servlet/Reactive/非 Web),加载环境和监听器。

  2. 准备运行环境
    加载 application.propertiesapplication.yml 配置,解析命令行参数,准备 ConfigurableEnvironment

  3. 创建应用上下文
    根据应用类型创建对应的 ApplicationContext,例如:

    • AnnotationConfigServletWebServerApplicationContext(Servlet 应用)
    • ReactiveWebServerApplicationContext(Reactive 应用)
  4. 刷新上下文
    完成 Bean 的加载、依赖注入、AOP 代理等操作,启动内嵌的 Web 服务器(如果需要)。

  5. 通知监听器和执行扩展点
    触发生命周期事件,执行 CommandLineRunnerApplicationRunner

  6. 启动完成
    应用准备好后,触发 ApplicationReadyEvent,正式进入运行状态。


2. 核心组件解析

2.1 环境准备

Spring Boot 通过 ConfigurableEnvironment 统一管理环境变量、配置文件、系统属性等信息。

  • 加载顺序

    1. 系统属性(如 -D 参数)。
    2. 环境变量(System.getenv())。
    3. 配置文件(application.propertiesapplication.yml)。
    4. 命令行参数(args)。
  • 扩展点
    可以通过实现 EnvironmentPostProcessor 来自定义环境变量加载逻辑。


2.2 上下文创建

Spring Boot 根据应用类型选择合适的 ApplicationContext

应用类型上下文类型说明
Servlet 应用AnnotationConfigServletWebServerApplicationContext默认的 Web 应用上下文。
Reactive 应用ReactiveWebServerApplicationContext响应式编程应用上下文。
非 Web 应用GenericApplicationContext普通 Java 应用上下文。

上下文创建时,还会完成以下工作:

  • 注册基础组件,如 EnvironmentResourceLoader
  • 加载 Bean 定义,准备好应用的依赖图。

2.3 Bean 加载与初始化

  • 扫描与加载
    通过 @ComponentScan 扫描包路径,加载所有标注了 @Component@Service@Repository@Controller 等注解的类。

  • 生命周期回调
    初始化过程中,Spring 会调用以下接口或注解:

    • InitializingBeanafterPropertiesSet()
    • @PostConstruct 方法。
  • AOP 代理
    根据 @EnableAspectJAutoProxy 自动为符合条件的 Bean 创建代理。


2.4 自动配置

Spring Boot 的 “魔法” 很大程度上来自于自动配置机制,通过 @EnableAutoConfiguration 实现。

  • 实现原理
    Spring Boot 使用 spring.factories 文件加载所有自动配置类。

  • 核心类
    @ConditionalOnClass@ConditionalOnProperty 等条件注解,控制是否加载自动配置。

  • 扩展点
    可以通过实现 AutoConfigurationImportFilter 自定义自动配置类的加载行为。


3. 生命周期事件

Spring Boot 在启动过程中会触发以下事件,开发者可以通过监听器进行自定义逻辑处理:

事件名称触发时机
ApplicationStartingEvent应用启动开始。
ApplicationEnvironmentPreparedEvent环境变量准备完成。
ApplicationPreparedEvent上下文准备完成但未刷新。
ApplicationStartedEvent上下文刷新完成。
ApplicationReadyEvent应用完全启动,准备好接收请求。
ApplicationFailedEvent启动失败。

例如,监听 ApplicationReadyEvent

@Component
public class MyApplicationReadyListener implements ApplicationListener<ApplicationReadyEvent> {
    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        System.out.println("Application is ready!");
    }
}

4. 启动异常处理机制

Spring Boot 使用 handleRunFailure 方法集中处理启动过程中的异常:

  • 处理方式

    1. 打印错误日志。
    2. 调用注册的 SpringApplicationRunListenerfailed() 方法。
    3. 关闭应用上下文,释放资源。
  • 常见异常

    • BeanDefinitionStoreException:Bean 定义加载错误。
    • UnsatisfiedDependencyException:依赖注入失败。
    • IllegalStateException:上下文状态非法。

5. 总结

Spring Boot 的启动流程高度模块化,既有固定的主流程,又为开发者提供了丰富的扩展点。主要流程可总结为:

  1. 准备阶段:初始化 SpringApplication,加载环境和监听器。
  2. 上下文加载:创建 ApplicationContext,加载配置和 Bean 定义。
  3. 上下文刷新:完成 Bean 的依赖注入和初始化,启动内嵌服务器。
  4. 扩展与回调:通知监听器、调用 Runner 接口、触发生命周期事件。

通过理解 Spring Boot 启动流程,你可以更高效地调试问题、优化启动性能,甚至自定义启动行为,从而更好地掌控你的应用。



http://www.kler.cn/a/421124.html

相关文章:

  • Day4:生信新手笔记 — R语言简单命令与Rstudio配置
  • 使用ESP32通过Arduino IDE点亮1.8寸TFT显示屏
  • 《山海经》:北山
  • 嵌入式硬件实战提升篇(三)商用量产电源设计方案 三路电源输入设计 电源管理 多输入供电自动管理 DCDC降压
  • 乐橙云小程序插件接入HbuilderX
  • JVM 类加载 详解
  • CSS定位技术详解:从基础到高级应用
  • koa中间件
  • AcWing 841. 字符串哈希
  • 深入探索进程间通信:System V IPC的机制与应用
  • PLC协议
  • eBPF:现代Linux的强大内核扩展技术
  • docker搭建umami
  • PHM技术:一维信号时序全特征分析(统计域/频域/时域)| 信号处理
  • 【机器人】01 强化学习、模仿学习和运动规划 仿真平台ISAAC Lab安装与使用
  • 代码随想录-算法训练营day31(贪心算法01:分发饼干,摆动序列,最大子数组和)
  • 【CUDA】Kernel Atomic Stream
  • python学opencv|读取视频(一)灰度视频制作和保存
  • Nginx 转发代理天地图服务
  • adb导出系统apk
  • vulnhub靶场【哈利波特】三部曲之Aragog
  • std::thread()函数的第一个参数的使用细节
  • FreeSWITCH mod_conference 的按键会控
  • 【C++】智能指针的使用和原理
  • 总结拓展十七:特殊采购业务——委外业务
  • 数据结构——有序二叉树的删除