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)

1107. 魔板(BFS,最小步数模型,unordered_map哈希)

1107. 魔板 - AcWing题库 Rubik 先生在发明了风靡全球的魔方之后,又发明了它的二维版本——魔板。 这是一张有 8 个大小相同的格子的魔板: 1 2 3 4 8 7 6 5我们知道魔板的每一个方格都有一种颜色。 这 8 种颜色用前 8 个正整数来表示。 可以用颜色的…

C语言面试之旅:掌握基础,探索深度(面试实战之ARM架构二)

读别人的代码,就像撕洋葱,每读一层,哭一遍。 引言 ARM 处理器是冯诺依曼存储结构,程序空间、RAM 空间及IO 映射空间统一编址,除对对RAM 操作以外,对外围IO、程序数据的访问均要通过加载/存储指令进…

介绍 Agency: 使AI与Go语言无缝对接

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等,您的关注将是我的更新动力! 在当今应用开发领域,类似OpenAI API等生成式AI技术的蓬勃发展正在彻底改变着应用开发的格局。Python和JavaScript等语…

App内存优化

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

小程序的分包加载具体流程

在小程序项目的 app.json 文件中配置分包信息。通过设置 subpackages 字段,指定每个分包的根目录路径和分包的名称。 "subpackages": [{"root": "subpackage1","name": "subpackage1"},{"root": &quo…

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):经过小孔成…

21 俄罗斯套娃信封问题

问题描述,给你一个二维数组envelopes,其中envelopes[i][wi,hi].表示第i个信封的宽度和高度,当另一个信封的宽度和噶度都比这个信封大的时候就可以放进另一个信封里,如同俄罗斯套娃一样。请计算最多能有多少个信封能组成一套“俄罗…

Debugging Application Engine Programs 调试应用程序引擎程序

Debugging Application Engine Programs 调试应用程序引擎程序 This section discusses how to: 本节讨论如何: Enable the Application Engine debugger.启用应用程序引擎调试器。Set debugging options.设置调试选项。 Enabling the Application Engine Debu…

Java数组面试题

Java数组面试题 1. 创建一个包含多个元素的数组,并打印输出数组的内容。 public class Main {public static void main(String[] args) {String[] array {"apple", "banana", "orange"};for (String element : array) {System.out…

微服务实战系列之J2Cache

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

【华为OD题库-070】数列描述-java

题目 题目描述: 有一个数列A[n],从A[0]开始每一项都是一个数字,数列中A[n1]都是A[n]的描述,其中A[0]1,规则如下; A[0]:1 A[1]:11 含义其中A[0]1是1个1即11,表示A[0]从左到右连续出现了1次1 A[2]:21 含义其中A[1]11是2个…

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

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

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

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