SpringBoot 启动流程

news/2025/1/15 15:11:28/
  1. 概述

    SpringBoot 是一个基于 Spring 的框架,它通过自动配置和约定大于配置的方式,简化了 Spring 应用程序的开发和部署。在本文中,我们将会深入了解 Spring Boot 的启动流程,掌握 Spring Boot 应用程序是如何启动并初始化的。

  2. 构建环境

    在了解 Spring Boot 的启动流程之前,需要先理解 Spring Boot 的构建环境。Spring Boot 支持多种构建工具,包括 Maven 和 Gradle 等。一般来说,在使用 Maven 构建 Spring Boot 应用程序时,需要将 spring-boot-starter-parentspring-boot-dependencies 作为父项目添加到 pom.xml 中;而在使用 Gradle 时,则需要在 build.gradle 文件中引入相应的依赖。

  3. 主类定义

    Spring Boot 应用程序的入口是一个 Java 类,一般称为主类。主类需要添加 @SpringBootApplication 注解,该注解包含了 @EnableAutoConfiguration@ComponentScan@Configuration 三个注解。其中,@EnableAutoConfiguration 用于启用 Spring Boot 自动配置功能,@ComponentScan 用于指定要扫描的包,@Configuration 用于标注这是一个配置类。例如:

@SpringBootApplication
public class MyApp {public static void main(String[] args) {SpringApplication.run(MyApp.class, args);}
}
  1. 启动流程

    Spring Boot 应用程序的启动流程可以分为四个阶段:准备阶段、刷新上下文阶段、后置处理阶段和启动失败处理阶段。下面我们将逐一深入了解每个阶段的细节。

4.1 准备阶段

在准备阶段,Spring Boot 会创建一个 SpringApplication 对象,并对其进行配置。SpringApplication 是 Spring Boot 应用程序的核心类,它负责启动和管理 Spring 应用程序。在创建 SpringApplication 时,可以通过 new SpringApplication(MyApp.class) 或者 SpringApplication.run(MyApp.class, args) 方法来指定要启动的主类。在创建 SpringApplication 对象时,Spring Boot 会自动加载应用程序默认的配置文件(application.properties 或 application.yml),并将其转化为 Spring 环境中的属性值。

4.2 刷新上下文阶段

在准备阶段结束后,Spring Boot 开始进入刷新上下文阶段。在该阶段,Spring Boot 会依次执行以下操作:

4.2.1 创建环境对象

首先,Spring Boot 会根据环境变量 SPRING_APPLICATION_JSON、命令行参数、系统属性等信息创建一个 Environment 对象,并把它设置为 Spring 环境的默认环境。Environment 对象负责管理应用程序的所有配置属性,包括命令行参数等。

4.2.2 加载配置文件

接下来,Spring Boot 会根据默认规则和自定义配置加载配置文件。在默认情况下,Spring Boot 会按照以下顺序加载配置文件:

  • file:./config/application.properties
  • file:./config/application.yml
  • classpath:/config/application.properties
  • classpath:/config/application.yml

如果需要修改默认的配置文件路径,可以在 SpringApplication.run() 方法中通过 --spring.config.location 参数指定。例如,可以通过以下方式指定配置文件路径为 /app/config/:

SpringApplication.run(MyApp.class, "--spring.config.location=/app/config/");

4.2.3 创建 SpringApplication 上下文

接着,Spring Boot 会创建一个 SpringApplication 上下文,并将 Environment 对象设置到上下文中。SpringApplication 上下文是 Spring 应用程序的核心容器,负责管理应用程序的所有 Bean。在创建 SpringApplication 上下文之前,Spring Boot 会根据 classpath 扫描包含 @Component 注解的类,并对其进行注册。这些类通常包括控制器、服务和数据访问对象等组件。

4.2.4 加载 Bean 定义

在创建 SpringApplication 上下文后,Spring Boot 会根据 Bean 定义信息生成所有 Bean 实例,并将其添加到容器中。在加载 Bean 定义时,Spring Boot 会运行所有实现了 BeanFactoryPostProcessor 接口的 BeanFactory 后置处理器。BeanFactory 后置处理器负责在创建 Bean 实例之前修改 Bean 的定义信息,例如替换默认实现、添加 AOP 切面等。

4.2.5 注册 BeanPostProcessor

在加载 Bean 定义后,Spring Boot 会注册所有实现了 BeanPostProcessor 接口的 Bean 后置处理器。Bean 后置处理器负责在 Bean 被实例化前后对其进行一些操作,例如添加代理对象、修改属性值等。

4.2.6 初始化非 Web 应用程序上下文

在完成以上操作后,Spring Boot 会初始化非 Web 应用程序上下文,包括事件监听器和组件初始化器等。这些组件通常用于应用程序初始化或清理工作,例如加载资源文件、初始化数据库连接池等。

4.2.7 刷新上下文

最后,在完成所有初始化工作之后,Spring Boot 会调用 refresh() 方法来刷新 SpringApplication 上下文。该方法会启动 Spring 应用程序并加载所有 Bean 实例,然后将上下文发布到 Spring 事件通知机制中,供其他组件使用。

4.3 后置处理阶段

在刷新上下文阶段结束后,Spring Boot 会进入后置处理阶段。在该阶段,Spring Boot 会运行所有实现了 ApplicationRunner 或 CommandLineRunner 接口的组件。这些组件通常用于应用程序启动后的初始化工作,例如读取配置文件、初始化缓存等。

4.4 启动失败处理阶段

如果在刷新 SpringApplication 上下文过程中发生异常,则 Spring Boot 会进入启动失败处理阶段。在该阶段,Spring Boot 会打印出所有异常信息,并尝试优雅地关闭 SpringApplication 上下文。如果在关闭上下文时又发生异常,则 Spring Boot 会将该异常作为新的启动异常抛出。

  1. 总结

综上所述,Spring Boot 应用程序的启动流程可以分为准备阶段、刷新上下文阶段、后置处理阶段和启动失败处理阶段。在启动过程中,Spring Boot 会自动加载配置文件、扫描包含 @Component 注解的类、生成 Bean 定义并初始化所有 Bean 实例等。因此,使用 Spring Boot 可以大大简化应用程序的开发和部署,提高生产效率和代码质量。


http://www.ppmy.cn/news/95843.html

相关文章

JVM Sandbox入门详解

一. 概述 在日常开发中,经常会接触到面向AOP编程的思想,我们通常会使用Spring AOP来做统一的权限认证、异常捕获返回、日志记录等工作。之所以使用Spring AOP来实现上述功能,是因为这些场景本质上来说都是与业务场景挂钩的,但是具…

【linux系统操作】 - 技术一览

文章目录 1. 用户管理2. 文件管理3. 文件系统4. 字符处理5. 网络管理6. 进程管理7. 软件安装8. vi和vim编辑器9. 正则表达式 1. 用户管理 1.用户和用户组 2.账号管理 新增和删除用户、组;检查用户信息切换用户信息、用其他用户身份执行例行任务管理 : 周期性执行任…

Qt自定义的ColorDialog--仿QColorDialog

Qt已经有了色板选择,但是它使用QDialog形成的,每次调用基本上都成了点一个按钮,谈一个模态框,选择好颜色之后再关掉模态框。 但是,如果想将颜色选择板放在窗口上,并不会有模态的功能就会比较麻烦&#xff…

pta(浙大第四版)五道经典练习题③

目录 ①7-4 IP地址转换 ②、查找日期 ③藏头词 四、IP地址转换 五、删除链表值为偶数的节点 ①7-4 IP地址转换 题述:IP地址转换:一个IP地址是用四个字节(每个字节8个位)的二进制码组成。输入32位二进制字符串,输…

Apache Kafka - 高性能原因探究

文章目录 概述图解 概述 Kafka 的高性能主要依赖于以下几个关键因素: 分布式架构:Kafka 采用分布式集群架构,可以水平扩展到上万个节点,支持每秒处理百万级消息。持久化存储:Kafka 使用文件系统持久化存储消息,避免了数据库成为性能瓶颈,大大提高了吞吐量。顺序读写:Kafka 的…

基于STM32的DHT11温湿度测量

目录 1.简介 2.主要参数 3.引脚说明 4.注意事项 5.单总线协议 6.数据格式 7.工作时序 8.分模块编写程序 1.简介 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠…

Unity包围盒

序 比如,目前导入了一个obj文件,想知道它的AABB包围盒是什么。 官方文档 Unity - Scripting API: Bounds (unity3d.com) 可以看到,包围盒有三个类别的: Mesh.bounds Unity - Scripting API: Mesh.bounds (unity3d.com) 不随…

Mysql中的not in和null

MySQL中的not in和null 当我们在MySQL中使用not in时,例如 select id from user when id not in(...)如果not in(…)数据中有null时,返回的结果是空表。 错误在于判断 a not in B的方法的本质是a 使用 ! 与B中的每一条进行判断 比如 3 not in (null…