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

springboot的启动流程

一文彻底弄懂Spring Boot的启动过程 

一,Spring Boot启动过程

1. 启动入口

Spring Boot 应用的启动入口通常是一个包含 @SpringBootApplication 注解的主类,并调用 SpringApplication.run() 方法。@SpringBootApplication 是一个复合注解,包含了 @Configuration@EnableAutoConfiguration@ComponentScan,从而开启了自动配置和组件扫描。

源码路径在 SpringApplication 类的 run() 方法:

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

 

这个入口主要做了以下几件事情:

  1. 创建 SpringApplication 实例:初始化 Spring Boot 环境。
  2. 初始化环境和监听器:设置启动的 Environment,并且添加 ApplicationListener 监听器。
  3. 准备和刷新 Spring 上下文:通过 prepareContextrefreshContext 方法进行上下文环境的准备和刷新。

2. 创建 SpringApplication 实例

SpringApplication 的构造方法中,Spring Boot 解析应用的启动模式(例如是 Web 应用、Servlet 应用或是普通应用),并初始化应用的上下文类型。Spring Boot 的不同上下文类型包括 AnnotationConfigApplicationContext(非 Web 应用)和 AnnotationConfigServletWebServerApplicationContext(Web 应用)。

3. 初始化 Environment 和监听器

接下来,Spring Boot 会初始化 ConfigurableEnvironment,这个环境中包含了系统的属性、环境变量、配置文件等数据,作为后续加载 Bean 定义和初始化的基础。

同时,Spring Boot 也会初始化一系列的 ApplicationListener,用于监听和处理应用启动过程中的事件,比如 ApplicationEnvironmentPreparedEventApplicationPreparedEvent 等。

4. 加载配置类并触发自动配置

Spring Boot 使用 @EnableAutoConfiguration 注解触发自动配置,核心实现是在 AutoConfigurationImportSelector 中加载 META-INF/spring.factories 配置文件,文件中列出了许多自动配置类(如 DataSourceAutoConfigurationJpaRepositoriesAutoConfiguration 等),根据条件(例如某些 Bean 是否存在、某些属性是否被配置等)加载相应的自动配置。

5. 加载并注册 Bean

refreshContext() 方法中,Spring Boot 调用 refresh() 方法,这一步骤中完成了 BeanFactory 的初始化和 BeanPostProcessor 的注册,并解析 @Component@Service@Repository 等注解标注的 Bean 定义,将它们注册到 BeanFactory 中。

在源码层面,refresh() 方法中,invokeBeanFactoryPostProcessorsregisterBeanPostProcessors 这两个方法是关键,分别用于执行所有 BeanFactoryPostProcessorBeanPostProcessor,确保 Bean 的生命周期正确管理。

6. Web 环境中的嵌入式容器启动

在 Web 应用中,Spring Boot 会启动嵌入式 Web 容器(如 Tomcat 或 Jetty)。Spring Boot 默认通过 ServletWebServerApplicationContext 启动内嵌的 Web 服务器。在 refresh() 的最后,会启动嵌入式容器,将应用作为 Web 应用发布。

7. 执行 ApplicationRunner 和 CommandLineRunner

Spring Boot 启动完成后,会扫描并执行所有实现了 ApplicationRunnerCommandLineRunner 接口的 Bean。它们可以用于在启动后执行自定义逻辑。

8. 发布应用启动完成事件

最后,Spring Boot 发布 ApplicationReadyEvent 事件,通知所有监听器应用已启动完成。至此,Spring Boot 应用正式启动完成,可以接收 HTTP 请求或执行其他任务。

二、Spring Boot 启动过程的架构设计

在 Spring Boot 应用启动的过程中,SpringApplication.run() 是最常用的启动方式。通过这个方法,Spring Boot 为开发者屏蔽了大量复杂的初始化细节,我们只需提供主启动类的入口和简单的配置信息即可启动整个应用。

下面我们从源码入手,分步骤分析 SpringApplication.run 进行的操作。

1,SpringApplication.run() 的详细流程

SpringApplication.run 主要完成以下几大步骤:

  1. 初始化 SpringApplication 实例

    该实例负责整个 Spring Boot 应用的启动过程,通过判断应用类型和设置环境变量为后续配置加载和应用上下文创建提供基础。核心方法为 SpringApplication#prepareEnvironmentSpringApplication#createApplicationContext

  2. 创建应用上下文并刷新上下文

    SpringApplication 将根据应用类型来创建不同的 ApplicationContext(如 AnnotationConfigApplicationContextServletWebServerApplicationContext),并将所有 Bean 装载到上下文中。

  3. 加载环境配置

    Spring Boot 会基于开发环境或生产环境加载不同的配置文件。核心是 ConfigFileApplicationListener 监听配置事件,解析应用配置文件(application.propertiesapplication.yml)并装配到应用上下文的 Environment 对象中。

  4. 启动嵌入式容器

    如果是 Web 应用,Spring Boot 会启动内嵌的服务器(如 Tomcat、Jetty 或 Undertow),并将 DispatcherServlet 注册到服务器中。

 

https://www.cnblogs.com/lgx211/p/18535984

http://www.wxhsa.cn/company.asp?id=4934

相关文章:

  • 萤火虫旅行网和萤火虫文旅的关系是什么
  • 「微积分 A1」基础知识(连载中)
  • 第2周-预习作业
  • P12546 [UOI 2025] Convex Array
  • 一个新词:测试可靠性
  • CF827F Dirty Arkadys Kitchen
  • P2839 [国家集训队] middle
  • wuti
  • 友链
  • 向量化存储与知识图谱的比较
  • 力扣17题 电话号码的字母组合
  • 萤火虫文旅年票、为什么能做到低至4.2元一张景区门票、还能高达50%的毛利润?
  • ubuntu服务器docker容器安装nacos
  • PWN手的成长之路-02-r3m4ke
  • SAP 采购订单税率及含税金额取数
  • 深入解析:Linux x86 stability和coredump
  • 9.15更新linux命令
  • Jenkins 容器和 Kubernetes Agent
  • LGP7916 [CSP-S 2021] 交通规划 学习笔记
  • 详细介绍:【Kubernetes】常见面试题汇总(十四)
  • 萤火虫文旅年票、为何能成为撬动万亿文旅市场的利器
  • 教育行业API安全最佳实践:全知科技以国家标准引领数据防护新范式
  • Codecademy Pro是否值得?2023年深度评测与技术特性解析
  • Qt处理USB摄像头开发说明与QtMultimedia与V4L2融合应用
  • 实用指南:【性能优化需要关注的参数——Batches】
  • 禁止指定软件联网
  • 详细介绍:C++(静态函数)
  • 2025.9.15日软件工程学习日志
  • RocketMQ快速实战及核心概念
  • 【南方科技大学主办】第五届电气工程与机电一体化手艺国际学术会议(ICEEMT 2025)