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


相关推荐
陈平安Java and C2 小时前
MyBatisPlus
java
秋野酱2 小时前
如何在 Spring Boot 中实现自定义属性
java·数据库·spring boot
安的列斯凯奇3 小时前
SpringBoot篇 单元测试 理论篇
spring boot·后端·单元测试
Bunny02123 小时前
SpringMVC笔记
java·redis·笔记
架构文摘JGWZ3 小时前
FastJson很快,有什么用?
后端·学习
BinaryBardC3 小时前
Swift语言的网络编程
开发语言·后端·golang
feng_blog66883 小时前
【docker-1】快速入门docker
java·docker·eureka
邓熙榆3 小时前
Haskell语言的正则表达式
开发语言·后端·golang
枫叶落雨2225 小时前
04JavaWeb——Maven-SpringBootWeb入门
java·maven
m0_748232395 小时前
SpringMVC新版本踩坑[已解决]
java