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

Spring Boot 启动流程详解

本文完整解析 Spring Boot 启动流程的 9 个核心阶段,结合源码与实战场景,帮助开发者深入理解框架运行机制。适用于面试准备和技术原理学习。

一、启动入口:SpringApplication.run()

public static ConfigurableApplicationContext run(Class<?> primarySource, String[] args) {return new SpringApplication(primarySource).run(args);
}

二、完整启动流程(9大核心阶段)

阶段1:初始化启动计时器

StopWatch stopWatch = new StopWatch();
stopWatch.start();

阶段2:监听器初始化与启动事件

SpringApplicationRunListeners listeners = getRunListeners(args);
listeners.starting(); // 发布ApplicationStartingEvent
  • ​作用​​:通知所有SpringApplicationRunListener启动开始
  • ​扩展点​​:可自定义监听器实现初始化日志、监控等操作

阶段3:环境准备与环境事件

ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArgs);
graph TDA[创建Environment对象] --> B[加载配置源]B --> C[解析Profile配置]C --> D[转换配置属性]D --> E[发布ApplicationEnvironmentPreparedEvent]

阶段4:打印Banner

Banner printedBanner = printBanner(environment);
  • 默认打印SPRING BOOT字符Logo
  • 支持自定义banner.txt文件或完全禁用

阶段5:创建应用上下文

context = createApplicationContext();

​上下文类型判断逻辑:​

protected ConfigurableApplicationContext createApplicationContext() {return switch (this.webApplicationType) {case SERVLET -> new AnnotationConfigServletWebServerApplicationContext();case REACTIVE -> new AnnotationConfigReactiveWebServerApplicationContext();default -> new AnnotationConfigApplicationContext(); // 非Web应用};
}

阶段6:上下文预处理

prepareContext(context, environment, listeners, appArgs, printedBanner);

​核心步骤:​

  1. 关联环境配置到上下文
  2. 应用ApplicationContextInitializer扩展点
  3. 发布ApplicationContextInitializedEvent
  4. 注册主配置类(@SpringBootApplication注解类)
  5. 发布ApplicationPreparedEvent

阶段7:★★★ 核心刷新阶段 ★★★

refreshContext(context); // 内部调用Spring的refresh()

​Spring Framework的12步刷新流程:​

public void refresh() {// 1. 准备刷新prepareRefresh();// 2. 获取BeanFactoryConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// 3. 准备BeanFactoryprepareBeanFactory(beanFactory);try {// 4. 后置处理BeanFactorypostProcessBeanFactory(beanFactory);// 5. ★★★ 执行BeanFactoryPostProcessor(自动配置入口)invokeBeanFactoryPostProcessors(beanFactory);// 6. 注册BeanPostProcessorregisterBeanPostProcessors(beanFactory);// 7. 初始化消息源initMessageSource();// 8. 初始化事件广播器initApplicationEventMulticaster();// 9. ★ Web容器启动关键步骤onRefresh();// 10. 注册监听器registerListeners();// 11. ★★★ 实例化所有非延迟单例BeanfinishBeanFactoryInitialization(beanFactory);// 12. 完成刷新finishRefresh();} catch (BeansException ex) {// 异常处理...}
}
刷新阶段重点说明:
  1. ​自动装配触发点​​(invokeBeanFactoryPostProcessors):

    protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());// 这里会处理@SpringBootApplication->加载自动配置类
    }
  2. ​嵌入式容器启动点​​(onRefresh):

    protected void onRefresh() {super.onRefresh();try {createWebServer(); // 启动Tomcat/Jetty} catch (Throwable ex) {throw new ApplicationContextException("Unable to start web server", ex);}
    }
  3. ​Bean实例化点​​(finishBeanFactoryInitialization):

    protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {// 初始化所有非延迟单例BeanbeanFactory.preInstantiateSingletons();
    }

阶段8:刷新后处理

afterRefresh(context, appArgs);
  • ​默认空方法​​,开发人员可重写实现自定义逻辑
  • 典型应用:初始化数据库数据、启动定时任务等

阶段9:事件通知与Runner执行

stopWatch.stop();
listeners.started(context); // ApplicationStartedEvent
callRunners(context, appArgs); // 执行ApplicationRunner/CommandLineRunner
listeners.running(context); // ApplicationReadyEvent
Runner执行机制:
private void callRunners(ApplicationContext context, ApplicationArguments args) {List<Object> runners = new ArrayList<>();runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());AnnotationAwareOrderComparator.sort(runners);for (Object runner : runners) {if (runner instanceof ApplicationRunner) {((ApplicationRunner) runner).run(args);}if (runner instanceof CommandLineRunner) {((CommandLineRunner) runner).run(args.getSourceArgs());}}
}

三、Spring Boot启动流程全景图

graph TDA[SpringApplication.run] --> B[启动计时器]B --> C[初始化监听器]C --> D[发布StartingEvent]D --> E[准备Environment]E --> F[打印Banner]F --> G[创建上下文]G --> H[预处理上下文]H --> I[refreshContext核心]I --> J[后置处理]J --> K[发布StartedEvent]K --> L[执行Runner]L --> M[发布ReadyEvent]

四、关键技术原理

1. 自动装配机制

  1. 通过@EnableAutoConfiguration引入自动配置
  2. AutoConfigurationImportSelector扫描META-INF/spring.factories
  3. 使用@Conditional系列注解实现条件装配

2. 嵌入式容器启动

  1. ​Servle容器​​:自动探测并初始化Tomcat/Jetty/Undertow
  2. ​Reactive容器​​:支持Netty/Reactor等
  3. ​启动时机​​:在onRefresh()阶段创建WebServer

3. 配置加载顺序

1. 命令行参数
2. 系统环境变量
3. JNDI属性
4. Java系统属性
5. Profile-specific配置(application-{profile}.yml)
6. 主配置文件(application.yml)
7. @Configuration注解的@PropertySource
8. SpringApplication.setDefaultProperties

http://www.xdnf.cn/news/12976.html

相关文章:

  • 打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
  • Android Native 之 lmkd进程分析
  • 嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
  • NLP-数据集
  • wifi改ip地址有什么用?wifi改ip地址怎么改
  • LeetCode - 3. 无重复字符的最长子串
  • 无源一阶低通电路噪声如何计算
  • 音乐“穿梭机”AudioRelay,让你的音频“无缝对接”
  • push [特殊字符] present
  • 深入解析 Qwen3 基础模型:架构设计与技术创新
  • 第2课 SiC MOSFET与 Si IGBT 静态特性对比
  • 从0开始学习R语言--Day20--Wilcoxon秩和检验
  • 组件库实战-基建思路
  • Docker拉取MySQL后数据库连接失败的解决方案
  • P3 QT项目----记事本(3.8)
  • Qt的学习(二)
  • 用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法
  • HDMI 显示器热插拔对应显示应用启停测试
  • 高分辨率图像合成归一化流扩展
  • 02.运算符
  • 使用Spring Cloud Stream 模拟生产者消费者group destination的介绍(整合rabbitMQ)
  • c++默认类模板参数
  • K8S中的PV、PVC和StorageClass
  • 【C++】std::bind和std::placeholders
  • c# 局部函数 定义、功能与示例
  • 「Java基本语法」变量的使用
  • redis--黑马点评--Redisson快速入门
  • 自动化过程中,如何定位一闪而过的toast?
  • 【11408学习记录】考研数学攻坚:行列式本质、性质与计算全突破
  • Xen Server服务器释放磁盘空间