SringBoot的启动原理,保姆级带你认识,让面试管对你刮目相看

SringBoot的启动原理,保姆级带你认识,让面试管对你刮目相看

一,介绍

graph TD;
A[启动类] --> B[SpringApplication.run()]
B --> C[创建SpringApplication实例]
C --> D[初始化应用上下文]
D --> E[加载应用配置]
E --> F[执行自定义初始化器]
F --> G[执行ApplicationContextInitializer的initialize方法]
G --> H[准备上下文环境]
H --> I[加载配置源(默认为application.properties)]
I --> J[解析配置源]
J --> K[将解析结果存到Environment对象中]
K --> L[执行自定义属性源加载器]
L --> M[执行SpringApplicationListeners]
M --> N[执行ApplicationStartingEvent事件监听器]
N --> O[创建应用上下文]
O --> P[注册ShutdownHook]
P --> Q[准备上下文环境]
Q --> R[执行ApplicationContextInitializer的initialize方法]
R --> S[执行SpringApplicationListeners]
S --> T[执行ApplicationEnvironmentPreparedEvent事件监听器]
T --> U[装载BeanDefinition]
U --> V[执行SpringApplicationListeners]
V --> W[执行ApplicationContextInitializedEvent事件监听器]
W --> X[刷新应用上下文]
X --> Y[执行SpringApplicationListeners]
Y --> Z[执行ApplicationStartedEvent事件监听器]
Z --> A1[执行CommandLineRunner和ApplicationRunner接口的run方法]

二详细介绍

当我们启动 Spring Boot 应用程序时,Spring Boot 会按照一定的顺序执行一系列的操作,以完成应用程序的初始化和启动。下面是 Spring Boot 启动原理的详细步骤:

  1. 启动类中调用 SpringApplication.run() 方法,启动 Spring Boot 应用程序。

  2. 创建 SpringApplication 实例,对应用程序做一些初始化工作。这包括设置应用程序的类加载器、初始化默认的异常处理器等。

  3. 初始化应用上下文,即创建 ApplicationContext 对象。应用上下文是 Spring 框架的核心容器,负责管理和组织 Bean 对象。通过调用 SpringApplicationcreateApplicationContext() 方法,根据环境配置和应用类型来创建对应的应用上下文。

  4. 加载应用配置,默认配置文件为 application.propertiesSpringApplication 会通过 SpringApplication 的静态方法从默认位置加载配置文件,如 classpath:application.properties 或者 classpath:application.yml

  5. 执行自定义初始化器,即执行实现了 ApplicationContextInitializer 接口的类中的 initialize() 方法。这些初始化器可以在应用上下文创建之前对其进行自定义操作,比如修改配置、添加属性源等。

  6. 准备上下文环境,即为 Environment 对象初始化属性源,解析配置源,并将解析结果存储到 Environment 对象中。Environment 是一个抽象接口,Spring Boot 使用 StandardEnvironment 来实现它。在准备上下文环境时,应用程序会加载并解析配置文件,并将解析结果存储在 Environment 中。

  7. 执行自定义属性源加载器,即执行实现了 PropertySourceLoader 接口的类中的 load() 方法。自定义属性源加载器可以用来加载额外的属性源,比如数据库、远程配置中心等。

  8. 执行 SpringApplicationListeners,即执行实现了 SpringApplicationListener 接口的类中的 onApplicationEvent() 方法。这些监听器可以在应用程序的不同阶段进行监听和处理,比如在应用程序启动前后执行一些操作。

  9. 执行 ApplicationStartingEvent 事件监听器。这是一个特殊的事件,用于通知监听器应用程序即将开始启动。

  10. 创建应用上下文,即根据配置创建对应的 ApplicationContext 对象。Spring Boot 支持多种类型的应用上下文,如 AnnotationConfigApplicationContextClassPathXmlApplicationContext 等。具体的应用上下文类型由环境配置决定。

  11. 注册 ShutdownHook,在 JVM 关闭时回调关闭方法。这样可以确保应用程序在正常关闭之前完成必要的清理工作。

  12. 准备上下文环境,即为 Environment 对象初始化属性源,解析配置源,并将解析结果存储到 Environment 对象中。

  13. 执行 ApplicationContextInitializerinitialize() 方法。这里是再次执行自定义初始化器的机会,可以对应用程序上下文进行更多的自定义操作。

  14. 执行 SpringApplicationListeners,即执行实现了 SpringApplicationListener 接口的类中的 onApplicationEvent() 方法。这些监听器可以对应用程序上下文进行更多的监听和处理。

  15. 执行 ApplicationEnvironmentPreparedEvent 事件监听器。这个事件通知监听器应用程序环境已准备好,可以进行进一步的配置。

  16. 装载 BeanDefinition,即将配置文件中的 bean 装载到 ApplicationContext 中。在这一步中,Spring Boot 会扫描应用程序的类路径,根据配置文件中的信息,创建对应的 BeanDefinition,并将其注册到应用上下文中。

  17. 执行 SpringApplicationListeners,即执行实现了 SpringApplicationListener 接口的类中的 onApplicationEvent() 方法。这些监听器可以在装载 BeanDefinition 的过程中进行监听和处理。

  18. 执行 ApplicationContextInitializedEvent 事件监听器。这个事件通知监听器应用程序上下文已初始化完成。

  19. 刷新应用上下文,即完成 ApplicationContext 的初始化工作。在刷新过程中,Spring Boot 会执行一系列的生命周期回调方法,包括初始化 Bean、依赖注入、后置处理等。

  20. 执行 SpringApplicationListeners,即执行实现了 SpringApplicationListener 接口的类中的 onApplicationEvent() 方法。这些监听器可以在应用上下文刷新过程中进行监听和处理。

  21. 执行 ApplicationStartedEvent 事件监听器。这个事件通知监听器应用程序已启动。

  22. 执行 CommandLineRunnerApplicationRunner 接口的 run() 方法。这些接口可以在应用程序启动完成后执行一些特定的任务,比如初始化数据、启动定时任务等。

通过这些步骤,Spring Boot 将应用程序初始化并启动起来。开发人员可以根据需要进行自定义配置和扩展,以实现更加灵活和高效的应用程序。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/200193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树_二叉搜索树累加求和

//给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 // node.val 的值之和。 // // 提醒一下,二叉搜索树满足下列约束…

【Vulnhub 靶场】【hacksudo: FOG】【简单 - 中等】【20210514】

1、环境介绍 靶场介绍:https://www.vulnhub.com/entry/hacksudo-fog,697/ 靶场下载:https://download.vulnhub.com/hacksudo/hacksudo-FOG.zip 靶场难度:简单 - 中等 发布日期:2021年05月14日 文件大小:1.3 GB 靶场作…

解决 vite 中 import.meta.globEager is not function 的问题

本人正在重构两年前搭建到一半的博客网站,相关依赖都很陈旧,用到了 npm-check-updates 检测项目可升级依赖: 升级完成后解决完依赖发现控制台报错 import.meta.globEager is not function解决方案: vite版本降至4.3.0 亲测有效&…

忽略python运行出现的大量警告

添加以下代码即可 import warnings warnings.filterwarnings(ignore)

App内存优化

一、内存优化介绍 1.背景介绍 内存是大问题但缺乏关注压实骆驼的最后一个稻草(堆栈溢出) 2.内存问题 内存抖动:锯齿状、GC导致卡顿内存泄露:可用内存减少、频繁GC内存溢出:OOM,程序异常 二、优化工具选…

FreeRTOS简介

FreeRTOS简介 文章目录 FreeRTOS简介前言一、什么是FreeRTOS?二、FreeRTOS的特点三、FreeRTOS的版本和参考资料1、FreeRTOS版本2、FreeRTOS源码获取3、FreeRTOS参考资料 四、FreeRTOS源码简介 前言 FreeRTOS是一个可以基于ROM运行的、可裁剪的、抢占式、实时多任务…

Photoshop最新版PS2024安装使用 Ver25.0.0

Photoshop,这个是长红了几十年的软件,我大概从它的3.0版本开始用,目前已迭代到25.0,但一直还在用CS4/11.0版本,一直秉持着够用即可的原则,因为不是专业的平面设计人员,能够简单PP图片就行。&…

C++智能指针及简单实现

C智能指针 堆内存、栈内存与静态内存静态内存栈内存堆内存 动态内存管理new、delete运算符智能指针实现智能指针 shared_ptr智能指针的线程安全问题解决 unique_ptrweak_ptr循环引用 思维导图本模块思路 动态内存管理 - cppreference.com 堆内存、栈内存与静态内存 静态内存 …

视觉测量基础

1. 相机模型 1.1 坐标系转换原理 世界坐标系(world Coords):点在真实世界中的位置,描述相机位置。 相机坐标系(Cameras Coords):以相机光学系统中心(镜头中心)为原点,建立相机坐标系。 图像物理坐标系(Film Coords):经过小孔成…

微服务实战系列之J2Cache

前言 经过近几天陆续发布Cache系列博文,博主已对业界主流的缓存工具进行了基本介绍,当然也提到了一些基本技巧。相信各位盆友看见这么多Cache工具后,在选型上一定存在某些偏爱: A同学说:不管业务千变万化,我对Redis的…

企业如何制定精准营销策略?

在当今的数字化时代,位置数据已经成为企业营销策略中不可或缺的一部分。通过收集和分析客户的位置数据,企业可以更好地了解客户的行为和需求,制定更精准的营销策略,从而提高营销效率。 首先,利用IP地址位置数据可以帮助…

手搓图片滑动验证码_JavaScript进阶

手搓图片滑动验证码 背景代码效果图展示网站 背景 在做前端项目开发的时候,少不了登录注册部分,既然有登录注册就少不了机器人验证,验证的方法有很多种,比如短信验证码、邮箱验证码、图片滑动、图片验证码等。 由于鄙人在开发中…

9个Logo素材超多的Logo网站!

Logo 虽然看起来很简单,但是设计过程中的每一个细节都很精致。因为 Logo 作为品牌的象征,应该一目了然地传达给人们品牌的理念和形象。本文给大家整理了 7 个 Logo 素材网站和 2 个 Logo 在线制作网站。可以收集很多关 Logo 设计的内容和技巧&#xff01…

吉他初学者学习网站搭建系列(5)——如何做一个在线节拍器

文章目录 背景实现TransportLoop代码 在线尝试 背景 我们看吉他谱时,经常看到拍号,例如6/8。它的含义是一拍是一个八分音符,一小节有六拍。四分音符的时长是一秒,即60拍/分钟。基于这样的背景知识,我们就可以根据一些…

supervisor管理python进程

前言 平时开发调试中使用conda环境,项目比较多环境多,而且命令繁杂,每一次启动项目都可能会因为忘记启动方式而频繁报错。现在可以通过supervisor来管理,只需要配置几个文件,就可以轻松通过简单一致的命令启动工程&…

C++ day55 判断子序列 不同的子序列

题目1:392 判断子序列 题目链接:判断子序列 对题目的理解 判断字符串s是否为t的子序列 字符串s和字符串t的长度大于等于0,字符串s的长度小于等于字符串t的长度,本题其实和最长公共子序列的那道题很相似,相当于找两…

HashMap相关专题

前置知识:异或运算 异或运算介绍 异或有什么神奇之处(应用)? (1)快速比较两个值 (2)我们可以使用异或来使某些特定的位翻转,因为不管是0或者是1与1做异或将得到原值的相…

IntelliJ IDEA 2023.2新特性详解第三弹!Docker、Kubernetes等支持!

9 Docker 在 Docker 镜像层内预览文件 现在可以在 Services(服务)工具窗口中轻松访问和预览 Docker 镜像层的内容。 从列表选择镜像,选择 Show layers(显示层),然后点击 Analyze image for more informati…

<软考>软件设计师-2操作系统(总结)

(一) 进程管理 1 操作系统概述 1-1 操作系统定义: 能有效地组织和管理系统中的各种软/硬件资源,合理地组织计算机系统工作流程,控制程序的执行,并且向用户提供一个良好的工作环境和友好的接口。 1-2 操作系统的作用: 1 通过资源管理提高计…

7+WGCNA+机器学习+实验+泛癌分析,多要素干湿结合

今天给同学们分享一篇生信文章“Analysis and Experimental Validation of Rheumatoid Arthritis Innate Immunity Gene CYFIP2 and Pan-Cancer”,这篇文章发表在Front Immunol期刊上,影响因子为7.3。 结果解读: DEG筛选和数据预处理 数据在…