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

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

相关文章:

  • 安装便捷、维护省心,强力巨彩租赁屏助力视觉体验升级
  • LeetCode - 647. 回文子串
  • 求问,PMP属于职称认证吗?
  • PH热榜 | 2025-06-07
  • Redux Toolkit 快速入门指南:createSlice、configureStore、useSelector、useDispatch 全面解析
  • eNSP-IP数据包分析
  • (纳芯微)NST86-DSCR 精度±0.5℃,低功耗模拟输出温度传感器(-10.9mV/℃)负温度系数
  • CMIP6气候模式资料概览
  • 云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
  • 软件性能测试报告由谁出具?第三方软件测试机构
  • 医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
  • linux中如何在日志里面检索nowStage不等于1的数据的指令
  • Unit 1 深度强化学习简介
  • 机器人模仿学习调研
  • Infrastructure-Based Calibration of a Multi-Camera Rig
  • 基于TurtleBot3在Gazebo地图实现机器人远程控制
  • SQL注入篇-sqlmap的配置和使用
  • 拟合问题处理
  • 【C++进阶篇】智能指针
  • Java并发编程实战 Day 15:并发编程调试与问题排查
  • 北京网络公司注册/seo排名优化
  • 企业网站排名优化/头条热点新闻
  • 炫酷html5网站模板/青岛自动seo
  • 网站建设销售销售流程图/灰色词排名代做
  • 网站怎么做伪静态iis7.0/太原搜索排名提升
  • 做赛事下注网站违法吗/sem是什么的缩写