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

SpringBoot 启动流程

SpringBoot 启动流程

文字流程图

【启动入口】→ 执行标注@SpringBootApplication的主类main方法 ↓├→ 调用SpringApplication.run(主类.class, 命令行参数) ↓
【阶段一:SpringApplication实例化】├→ 1. 推断应用类型(Web/Servlet/WebFlux 或 非Web)├→ 2. 从META-INF/spring.factories加载ApplicationContextInitializer(上下文初始化器)├→ 3. 从META-INF/spring.factories加载ApplicationListener(事件监听器)├→ 4. 推断包含main方法的主类(确保后续注册为核心配置类)↓
【阶段二:执行SpringApplication.run()核心流程】├→ 步骤1:发布ApplicationStartingEvent(应用开始启动事件,用于早期扩展)↓├→ 步骤2:准备Environment(环境配置)│   ├→ 创建对应应用类型的Environment实例(如StandardServletEnvironment)│   ├→ 加载配置源:系统变量→系统属性→命令行参数→application.properties/yaml│   ├→ 激活指定Profiles(如dev/prod,加载对应环境配置)│   └→ 发布ApplicationEnvironmentPreparedEvent(环境就绪事件)↓├→ 步骤3:创建ApplicationContext(IoC容器)│   ├→ Web应用:创建AnnotationConfigServletWebServerApplicationContext│   └→ 非Web应用:创建AnnotationConfigApplicationContext↓├→ 步骤4:上下文预处理│   ├→ 调用ApplicationContextInitializer对上下文进行配置(如注入Environment)│   └→ 发布ApplicationContextInitializedEvent(上下文初始化事件)↓├→ 步骤5:将主类注册为上下文的核心配置类(确保后续扫描与解析)↓├→ 步骤6:刷新ApplicationContext(IoC容器初始化核心步骤)│   ├→ 1. 初始化BeanFactory(创建DefaultListableBeanFactory,Bean管理引擎)│   ├→ 2. 执行BeanFactory后置处理器│   │   ├→ ConfigurationClassPostProcessor解析@ComponentScan,扫描组件并注册Bean定义│   │   └→ 解析@EnableAutoConfiguration,加载META-INF/spring.factories中的AutoConfiguration类│   ├→ 3. 自动配置生效:AutoConfiguration类通过@Conditional判断是否配置Bean(如数据源、Tomcat)│   ├→ 4. 注册Bean后置处理器(用于Bean增强,如AOP代理)│   ├→ 5. 初始化消息源(处理国际化资源)与事件多播器(管理事件发布)│   ├→ 6. Web应用专属:创建并启动嵌入式服务器(如Tomcat,绑定端口)│   ├→ 7. 实例化非懒加载单例Bean(执行构造方法、@PostConstruct,完成依赖注入)│   └→ 8. 发布ContextRefreshedEvent(上下文刷新完成事件)↓
【阶段三:应用就绪收尾】├→ 步骤1:发布ApplicationStartedEvent(应用启动完成事件)├→ 步骤2:执行CommandLineRunner/ApplicationRunner(开发者自定义启动后逻辑,如数据预热)├→ 步骤3:发布ApplicationReadyEvent(应用就绪事件,可处理外部请求)↓
【启动完成】→ 嵌入式服务器监听端口,应用等待接收请求

核心概念

在深入流程前,需明确以下关键组件的作用:

  • @SpringBootApplication:启动类核心注解,整合@Configuration(配置类标识)、@ComponentScan(组件扫描)、@EnableAutoConfiguration(自动配置开关)三大功能。

  • SpringApplication:启动流程的 “总指挥”,负责统筹实例化、环境准备、上下文创建等核心步骤。

  • ApplicationContext:Spring IoC 容器(应用上下文),管理 Bean 的生命周期,不同应用类型(Web / 非 Web)对应不同实现类。

  • Environment:环境配置容器,存储系统变量、配置文件、命令行参数等配置信息。

  • ApplicationListener:事件监听器,监听启动过程中的各类事件(如启动开始、环境就绪),实现流程扩展。

  • AutoConfiguration:自动配置类,通过META-INF/spring.factories加载,结合@Conditional注解按需配置 Bean(如数据源、嵌入式服务器)。

各阶段核心细节说明

1. 阶段一:SpringApplication 实例化

此阶段为后续启动 “搭框架”,关键是确定应用类型与加载扩展组件:

  • 应用类型推断:通过判断类路径中是否存在javax.servlet.Servlet(Servlet Web)、org.springframework.web.reactive.DispatcherHandler(WebFlux)来区分应用类型,后续创建对应上下文。

  • 扩展组件加载META-INF/spring.factories是 SpringBoot 的 “扩展配置文件”,此处加载的初始化器与监听器,将在后续流程中参与上下文配置与事件响应。

2. 阶段二:run () 核心流程(启动核心驱动)

(1)环境准备(Environment)

环境是配置的 “统一容器”,加载顺序决定配置优先级(后加载的配置会覆盖前加载的):

  • 优先级从高到低:命令行参数(--server.port=8081)> 系统环境变量 > 应用配置文件(application.yaml)> 系统属性(System.getProperties())。

  • 多环境配置:通过spring.profiles.active=dev激活application-dev.yaml,实现 “一套代码,多环境部署”。

(2)上下文刷新(refresh ())

此步骤是 Spring IoC 容器初始化的 “核心引擎”,也是自动配置的 “落地环节”:

  • 自动配置逻辑@EnableAutoConfiguration导入AutoConfigurationImportSelector,从META-INF/spring.factories中加载所有AutoConfiguration类(如DataSourceAutoConfiguration),再通过@Conditional注解(如@ConditionalOnMissingBean:当容器中没有该 Bean 时才配置)判断是否生效,最终实现 “按需配置”。

  • 嵌入式服务器启动:Web 应用中,TomcatServletWebServerFactory会创建 Tomcat 实例,设置端口(默认 8080)、上下文路径,最后调用tomcat.start()启动服务器,无需手动部署 WAR 包。

3. 阶段三:应用就绪收尾

此阶段确保应用 “能干活”,关键是执行自定义逻辑与通知就绪状态:

  • CommandLineRunner vs ApplicationRunner:两者功能类似,区别在于参数类型 —— 前者接收String[]原始命令行参数,后者接收ApplicationArguments(支持解析--key=value格式参数)。

  • 事件触发顺序:启动过程中事件按 “StartingEnvironmentPreparedContextRefreshedStartedReady” 顺序触发,开发者可通过@EventListener监听指定事件,实现扩展(如监听ApplicationReadyEvent打印启动成功日志)。

常见问题与扩展点

1. 常见启动问题排查

  • Bean 未注册:检查@ComponentScan扫描范围是否覆盖 Bean 所在包(默认扫描主类所在包及其子包),或是否遗漏@Component/@Service等注解。

  • 端口冲突:通过netstat -ano | findstr "8080"(Windows)/lsof -i:8080(Linux)查看占用端口的进程,或修改server.port=0(随机端口)。

  • 自动配置不生效:添加debug=true到配置文件,启动日志会打印 “自动配置生效 / 不生效” 的原因(如缺少依赖导致@ConditionalOnClass不满足)。

2. 核心扩展点(开发者自定义)

  • 自定义初始化器:实现ApplicationContextInitializer,重写initialize方法(如设置全局配置context.getEnvironment().setActiveProfiles("dev")),并在META-INF/spring.factories中注册。

  • 自定义监听器:实现ApplicationListener<ApplicationReadyEvent>,监听应用就绪事件,执行启动后通知(如发送启动成功消息到消息队列)。

  • 自定义自动配置:创建XXXAutoConfiguration类,通过@Conditional定义生效条件,在META-INF/spring.factories中添加org.springframework.boot.autoconfigure.EnableAutoConfiguration=``com.xxx``.XXXAutoConfiguration,实现 “自定义组件开箱即用”。

http://www.dtcms.com/a/389681.html

相关文章:

  • .NET驾驭Word之力:结构化文档元素操作
  • 解密F5负载均衡:优化网络性能的关键
  • 使用 .NET Core 6 Web API 的 RabbitMQ 消息队列
  • 时空预测论文分享:图时空注意力网络 ConvLSTM 时空演变
  • 千问大模型部署笔记
  • 网络:开源网络协议栈介绍
  • 设计模式(C++)详解—装饰器模式(3)
  • 双重锁的单例模式
  • 管理 Git 项目中子模块的 commit id 的策略
  • 跨境电商API数据采集的流程是怎样的?
  • rust编写web服务07-Redis缓存
  • 第三十三天:高精度运算
  • 写联表查询SQL时筛选条件写在where 前面和后面有啥区别
  • ARM(13) - PWM控制LCD
  • Python基础 3》流程控制语句
  • 牛客算法基础noob44——数组计数维护
  • 并发编程原理与实战(三十)原子操作进阶,原子数组与字段更新器精讲
  • 前端-详解Vue异步更新
  • 基于风格的对抗生成网络
  • 【JavaScript】SSE
  • JAVA算法练习题day15
  • 线性表---双链表概述及应用
  • 作业帮前端面试(准备)
  • 51单片机-使用单总线通信协议驱动DS18B20模块教程
  • 全文单侧引号的替换方式
  • NVIDIA RTX4090 在Ubuntu系统中开启P2P peer access 直连访问
  • 再次深入学习深度学习|花书笔记2
  • 中移物联ML307C模组OPENCPU笔记1
  • 计算机视觉
  • VScode实现uniapp小程序开发(含小程序运行、热重载等)