Spring Boot 启动流程详解

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


目录

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

1. Spring Boot 启动的主要步骤

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

java 复制代码
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

java 复制代码
@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 启动流程,你可以更高效地调试问题、优化启动性能,甚至自定义启动行为,从而更好地掌控你的应用。


相关推荐
优雅的落幕14 分钟前
多线程---线程安全(synchronized)
java·开发语言·jvm
Charlie__ZS15 分钟前
帝可得-设备管理
java·maven·intellij-idea·idea
爱上语文20 分钟前
请求响应:常见参数接收及封装(数组集合参数及日期参数)
java·开发语言·spring boot·后端
孙同学_23 分钟前
【Linux篇】权限管理 - 用户与组权限详解
java·linux·服务器
CQU_JIAKE33 分钟前
926[study]Docker,DHCP
java·开发语言
浪 子36 分钟前
SpringBoot mq快速上手
java·spring boot·spring
程序猿进阶37 分钟前
Tomcat 都有哪些核心组件
java·开发语言·后端·面试·性能优化·tomcat·firefox
CodeSheep1 小时前
雷军又添一员猛将!!
前端·后端·程序员
码农阿豪1 小时前
极兔速递开放平台快递物流查询API对接流程
java·极兔开放平台·物流查询api
小金的学习笔记1 小时前
Java开发利器:IDEA的安装与使用(下)
java·开发语言·intellij-idea