还不懂 Spring Boot 启动流程的,看这一篇就够了!

news/2024/12/3 7:53:36/

通常,我们只需为一个类添加@SpringBootApplication注解,然后再添加一个main方法,其内固定的写法为SpringApplication.run(Application.class, args)。由此,便可启动Spring Boot服务。

具体而言,Spring Boot的启动流程包括以下几个步骤:

载入 Spring Boot 应用的启动类

根据启动类所在的包路径扫描相关的类文件

基于扫描到的类自动配置 Spring 应用

激活内嵌的 Web 服务器

启动 Spring 应用程序的运行
深入解析Spring Boot启动过程的源码实现:

@SpringBootConfiguration // 标记该类为 Spring Boot 应用程序的配置类
@EnableAutoConfiguration // 启用 Spring Boot 的自动配置机制
public class MyApp {public static void main(String[] args) {SpringApplication.run(MyApp.class, args); // 执行 Spring Boot 应用程序}
}

在启动 Spring Boot 应用程序时,需要在启动类上使用 @SpringBootApplication 注解,以通知 Spring Boot 这是应用程序的启动类。@SpringBootApplication 注解包含了三个子注解,分别为 @Configuration、@EnableAutoConfiguration 和 @ComponentScan,分别表示该类是配置类、启用自动配置和扫描组件。

在 main 方法中,我们可以使用以下代码来启动 Spring Boot 应用程序:

public class MyApp {public static void main(String[] args) {SpringApplication.run(MyApp.class, args);}}

该方法接受两个参数,第一个参数是启动类的类对象 MyApp.class,第二个参数是主方法的参数 args,主方法的参数可以通过命令行参数传递给应用程序。

在 SpringApplication.run 方法中,会执行以下几个步骤:

实例化一个 SpringApplication 对象,它存储了 Spring Boot 应用程序的所有配置信息。
基于 SpringApplication 中的配置信息,初始化一个 ApplicationContext 对象,它是 Spring 应用程序的上下文。
在 ApplicationContext 中注册所有带有 @Configuration 注解的类。
根据 @EnableAutoConfiguration 注解,自动配置 Spring 应用程序。
扫描所有带有 @Component 注解的类,并将它们注册到 ApplicationContext 中。
启动嵌入式 Web 服务器。
运行 Spring 应用程序。
以下是 SpringApplication.run 方法的源代码注释:

  /***   这是 Spring Boot 应用程序的入口点*   @param primarySource 应用程序的主要源(通常是一个@Configuration类)。*   @param args 命令行参数。*   @return ApplicationContext。 */public static ConfigurableApplicationContext run(Class\<?> primarySource, String... args) {return run(new Class[]{primarySource}, args);}/***   这是 Spring Boot 应用程序的入口点。*   @param primarySources 应用程序的主要源(通常是一个@Configuration类)。*   @param args 命令行参数。*   @return ApplicationContext。*/public static ConfigurableApplicationContext run(Class&lt;?&gt;[] primarySources, String[] args) {// 创建一个新的 SpringApplication 实例,主要用于设置 SpringApplication 的属性SpringApplication application = new SpringApplication(primarySources);// 应用程序启动时应用的环境。 这可以被用来定制化应用程序环境以及激活不同的配置文件属性。默认情况下, SpringApplication 将使用适当的 PropertySourceLoader 从 application.properties 中加载默认的属性。applyInitializers(application);// 设置命令行参数ConfigurableApplicationContext context = application.run(args);// 后置操作postProcessApplicationContext(context);return context;}public static ConfigurableApplicationContext launch(Class&lt;?&gt; primarySource, String... args) {return launch(new Class<?>[] { primarySource }, args);}public static ConfigurableApplicationContext launch(Class<?>[] primarySources, String[] args) {// 创建 Launcher 对象,包含了所有的应用程序配置信息Launcher launcher = new Launcher(primarySources);// 运行应用程序,并返回上下文对象return launcher.run(args);}public ConfigurableApplicationContext run(String... args) {// 创建并启动 ConfigurableApplicationContext 对象,返回该对象ConfigurableApplicationContext context = createApplicationContext();// 执行应用程序的监听器listeners.starting(this.applicationArguments);try {// 准备 ApplicationContext 环境prepareEnvironment(context, this.environment);// 配置 ApplicationContextconfigureIgnoreBeanInfo(context);// 执行所有的 ApplicationContextInitializerapplyInitializers(context);// 执行所有的 LauncherRunListener 的 starting 方法listeners.contextPrepared(context);// 打印应用程序的 BannerBanner printedBanner = printBanner();// 创建 ApplicationContextcontext.refresh();// 将 ApplicationContext 注册到 JVM 关闭钩子中prepareContext(context, printedBanner);// 执行所有的 ApplicationContextInitializer 的 postProcessApplicationContext 方法postProcessApplicationContext(context);// 执行所有的 LauncherRunListener 的 contextLoaded 方法listeners.contextLoaded(context);}catch (Throwable ex) {handleRunFailure(context, ex, listeners);throw new IllegalStateException(ex);}try {// 执行所有的 LauncherRunListener 的 started 方法listeners.started(context);// 启动嵌入式的 Web 服务器callRunners(context, this.applicationArguments);}catch (Throwable ex) {handleRunFailure(context, ex, listeners);throw new IllegalStateException(ex);}try {// 执行所有的 LauncherRunListener 的 running 方法listeners.running(context);}catch (Throwable ex) {handleRunFailure(context, ex, listeners);throw new IllegalStateException(ex);}return context;}

在 SpringApplication.run 方法的执行过程中,会涉及到一系列关键步骤,其中包括 prepareEnvironment、applyInitializers、postProcessApplicationContext和callRunners 等方法的调用。这些方法都扮演着启动 Spring Boot 应用程序的重要角色,它们会对应用程序进行配置、初始化、启动等操作,确保整个应用程序的正常运行和稳定性。
好的,基本上三分钟已经讲完了,希望对各位有所帮助。如果还有任何疑问或需要补充的内容,欢迎在评论区或私信留言。今天的总结内容就到这里了,感谢大家的阅读。


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

相关文章

【C++】运算符重载(日期类的实现)

【C】运算符重载&#xff08;日期类的实现&#xff09; 前言运算符重载operator全局和类中 日期类的实现成员变量的确定构造函数拷贝构造 运算符重载部分的重载思路实现GETmonthdayoperator 的重载思路实现 -的与-的重载实现 各个比较运算符的重载实现 前置与后置实现 &#xf…

《Java设计模式学习》迭代器模式

在这里&#xff0c;包括在很多的书中&#xff0c;我们都会看到设计模式的Demo都很简单。但是我们在实际开发过程中&#xff0c;却往往很少用到类似的设计模式。 但是大家在看到这篇文章的时候&#xff0c;希望大家可以动手敲一下。也许在敲击的过程中&#xff0c;你能获取到一定…

创建本地LocalHost-SSL证书

mkcert 使用方法 mkcert 是一个开源工具&#xff0c;用于快速生成有效的本地开发证书。它可以帮助开发人员在本地环境中使用 HTTPS 加密来模拟真实的生产环境。 安装 首先&#xff0c;你需要安装 mkcert 工具。以下是在常见操作系统上安装的命令&#xff1a; macOS 使用 Homebr…

【2023 · CANN训练营第一季】进阶班 应用开发深入讲解→DVPP

1 数据预处理概述 1.1 典型使用场景 受网络结构和训练方式等因素的影响&#xff0c;绝大多数神经网络模型对输入数据都有格式上的限制。在计算视觉领域&#xff0c;这个限制大多体现在图像的尺寸、色域、归一化参数等。如果源图或视频的尺寸、格式等与网络模型的要求不—致时…

You Only Look Once:Unified,Real-Time Object Detection总结笔记

一、论文思想 1.将一个图像分成S*S个网格&#xff08;grid cell&#xff09;&#xff0c;如果某个object的中心落在这个网格中&#xff0c;则这个网络就负责预测这个object。 2.每个网格要预测B个bounding box&#xff0c;每个bounding box除了要预测位置之外&#xff0c;还要…

CVE-2023-27363 FOXIT PDF READER与EDITOR任意代码执行漏洞复现

目录 0x01 声明&#xff1a; 0x02 简介&#xff1a; 0x03 漏洞概述&#xff1a; 0x04 影响版本&#xff1a; 0x05 环境搭建&#xff1a; 文件下载&#xff1a; 0x06 漏洞复现&#xff1a; POC下载&#xff1a; 利用POC&#xff1a; RCE&#xff1a; 0x07 修复建议&a…

使用 ArcGIS 绘制地理位置图

目录 准备数据创建新的地图项目添加数据符号化地理数据添加地图元素和注释导出地理位置图地理位置图是一种用于展示地理数据的有力工具,而 ArcGIS 是一款功能强大的地理信息系统软件,提供了广泛的地理数据处理和可视化功能。本教程将介绍如何使用 ArcGIS 绘制地理位置图,以展…

xFormers安装使用

xFormers是一个模块化和可编程的Transformer建模库&#xff0c;可以加速图像的生成。 这种优化仅适用于nvidia gpus&#xff0c;它加快了图像生成&#xff0c;并降低了vram的使用量&#xff0c;而成本产生了非确定性的结果。 下载地址&#xff1a; https://github.com/faceb…