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

详解Springboot的启动流程

在 Redis 中实现分布式锁

  • 1. 主入口与 SpringApplication.run()
  • 2. 准备阶段
  • 3. 创建应用上下文(ApplicationContext)
  • 4. Bean 定义加载与上下文刷新
  • 5. Embedded Web Server 的启动(针对 Web 应用)
  • 6. ApplicationRunner 和 CommandLineRunner 执行
  • 7. 应用启动完成
  • 总结

1. 主入口与 SpringApplication.run()

  • 入口方法
    一般在应用的主类中有 public static void main(String[] args) 方法,该方法调用了 SpringApplication.run(Application.class, args)

  • SpringApplication 对象的创建
    通过 run() 方法,Spring Boot 创建了一个 SpringApplication 实例,这个实例负责整个启动流程的协调工作。

2. 准备阶段

  • Environment 准备
    在正式创建 Spring 应用上下文之前,Spring Boot 会先准备好环境(Environment),包括加载配置文件(如 application.properties 或 application.yml)、系统环境变量、命令行参数等信息,并解析成 Environment 对象。

  • Banner 展示
    在环境准备过程中,Spring Boot 会加载并打印启动 Banner。Banner 可以是默认的,也可以自定义。

  • 初始器(Initializers)和监听器(Listeners)注册
    根据配置,Spring Boot 会注册各类初始器和事件监听器,这些组件会在后续的启动过程中接收各类启动事件(如 ApplicationStartingEvent、ApplicationPreparedEvent、ApplicationReadyEvent 等)。

3. 创建应用上下文(ApplicationContext)

  • 选择容器类型
    Spring Boot 根据项目依赖和配置选择合适的 ApplicationContext 实现。例如,对于 Web 应用,会使用 AnnotationConfigServletWebServerApplicationContext,而对于非 Web 应用则使用 AnnotationConfigApplicationContext

  • 实例化上下文
    调用 createApplicationContext() 方法创建对应的上下文实例。

4. Bean 定义加载与上下文刷新

  • 加载 Bean 定义
    Spring Boot 通过扫描(Component Scan)、配置类(@Configuration)等方式加载所有需要注册的 Bean 定义。

  • 上下文刷新(refresh())
    在调用 refresh() 方法时,Spring 会完成:

    • BeanFactory 的初始化
      注册所有的 Bean 定义、处理依赖注入、应用 AOP 等;
    • BeanPostProcessor 的应用
      在 Bean 实例化前后进行各种处理,如注解解析、事务增强等;
    • 事件发布
      在关键时刻触发相应的启动事件通知注册的监听器。

5. Embedded Web Server 的启动(针对 Web 应用)

  • 启动嵌入式服务器
    对于 Spring Boot Web 应用,会自动配置并启动嵌入式的 Web 服务器(如 Tomcat、Jetty 或 Undertow)。在上下文刷新过程中,会创建服务器工厂并启动服务器。

  • DispatcherServlet 初始化
    随后会初始化并注册 DispatcherServlet,负责接收并分发 HTTP 请求。

6. ApplicationRunner 和 CommandLineRunner 执行

  • 运行自定义逻辑
    当所有 Bean 都已初始化完毕,并且上下文已经刷新后,Spring Boot 会查找并执行所有实现了 ApplicationRunnerCommandLineRunner 接口的 Bean,这些组件可以在应用启动完成后执行特定的业务逻辑。

7. 应用启动完成

  • 发布 ApplicationReadyEvent
    当所有启动步骤都完成后,Spring Boot 会发布一个 ApplicationReadyEvent 事件,表明应用已经完全启动并且可以开始接收请求。

  • 等待请求
    对于 Web 应用来说,嵌入式服务器此时已经在监听端口等待 HTTP 请求;对于其他类型应用,则进入运行状态等待任务执行或事件触发。

总结

整个启动过程可以概括为:

  1. 入口调用与环境准备:main 方法 -> SpringApplication.run() -> 加载配置与初始化环境
  2. 上下文创建与 Bean 加载:实例化 ApplicationContext -> 加载并注册 Bean 定义 -> 刷新上下文
  3. 嵌入式服务器启动(Web 应用):启动并配置内置 Web 服务器
  4. 启动后逻辑执行:执行 ApplicationRunner/CommandLineRunner -> 应用完全启动并准备就绪

Spring Boot 的启动流程可以概括为以下几个主要步骤:

  1. 启动入口: 程序从 main 方法开始执行,通常调用 SpringApplication.run(Application.class, args),这一步骤负责启动整个 SpringBoot 应用。

  2. 环境准备与Banner打印: 在运行 SpringApplication.run() 时,会初始化 SpringApplication 对象。这个过程中会准备好 Environment(包括读取配置文件、命令行参数等),同时还会打印出启动 Banner。

  3. ApplicationContext 的创建: 根据应用类型(比如 Web 应用或非 Web 应用),Spring Boot 会自动选择合适的 ApplicationContext 实现(例如 AnnotationConfigServletWebServerApplicationContext
    AnnotationConfigApplicationContext),并进行实例化。

  4. BeanDefinition 的加载与注册: Spring Boot 会扫描和加载所有的配置类以及自动装配的组件。这里包括对用户自定义配置类和自动配置类的处理,进而注册所有的 Bean 定义到容器中。

  5. ApplicationContext 的刷新: 调用 refresh() 方法,完成对容器的初始化,这一过程中会实例化所有单例 Bean,并触发 Bean 的生命周期回调,如@PostConstructInitializingBeanafterPropertiesSet() 等。

  6. 监听器与Runner的执行: Spring Boot 启动过程中会触发各种事件(如 ApplicationStartedEventApplicationReadyEvent),同时执行实现了CommandLineRunnerApplicationRunner 接口的组件,用于在应用启动完成后执行特定逻辑。

  7. 启动完成: 至此,Spring Boot 应用完成启动,等待接收请求或执行相应的业务逻辑。

相关文章:

  • 【HarmonyOS NEXT】关键资产存储开发案例
  • 纯内网环境安装1Panel面板与商店应用
  • 版本控制器Git ,Gitee如何连接Linux Gitee和Github区别
  • 信号的捕捉(操作部分)
  • 在linux上启动微服务
  • 前端模块化
  • Kubernetes学习笔记-项目简单部署
  • C语言复习笔记--数组
  • 网络编程之解除udp判断客户端是否断开
  • 调研报告:Hadoop 3.x Ozone 全景解析
  • 网络安全设备配置与管理-实验4-防火墙AAA服务配置
  • 仿新浪微博typecho主题源码
  • VulnHub-Web-Machine-N7通关攻略
  • 【DeepSeek学C++】移动构造函数
  • html5-qrcode前端打开摄像头扫描二维码功能
  • 【嵌入式学习】时钟 - 边缘触发锁存器
  • C# 零基础入门篇(19.DateTime 使用指南)
  • 【动态规划篇】91. 解码方法
  • Arduino示例代码讲解:Pitch follower 跟随
  • 舞狮表演(dp)
  • 长三角首次,在铁三赛事中感受竞技与生态的共鸣
  • 男子恶意遗弃幼子获刑,最高法发布涉未成年人家庭保护典型案例
  • 端午假期购票日历发布,今日可购买5月29日火车票
  • 耗资10亿潮汕豪宅“英之园”将强拆?区政府:非法占用集体土地
  • 科普|揭秘女性压力性尿失禁的真相
  • 新剧|《藏海传》定档,《折腰》《人生若如初见》今日开播