SpringBoot SpringBoot 原理篇 3 核心原理 3.5 启动流程【4】【5】【6】

news2025/1/28 1:11:29

SpringBoot

【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】

SpringBoot 原理篇

文章目录

      • SpringBoot
      • SpringBoot 原理篇
      • 3 核心原理
        • 3.5 启动流程【4】【5】【6】
          • 3.5.1 看源码咯
          • 3.5.2 总结

3 核心原理

3.5 启动流程【4】【5】【6】

3.5.1 看源码咯

在这里插入图片描述

OK, 接着上次我们已经把

在这里插入图片描述

这个东西了解得差不多了

在这里插入图片描述

就是前面这一段,它初始化了SpringBoot 程序的启动的所有相关配置

接下来就是看后面的run 方法了,点进去

在这里插入图片描述

运行整个过程 → 初始化容器【但是过程没那么简单】

ConfigurableApplicationContext

这是run 方法的返回值

在这里插入图片描述

一行一行的来看

StopWatch stopWatch = new StopWatch();

计时器

在这里插入图片描述

在这里插入图片描述

就是这样来的【所以,之前的初始化操作都没有算到显示给我们看的那个时间中【假象】】

【设置了计时器】

stopWatch.start();

【计时器开始】

DefaultBootstrapContext bootstrapContext = this.createBootstrapContext();

【系统引导信息对应的上下文对象】

ConfigurableApplicationContext context = null;

【定义了一个对象】

this.configureHeadlessProperty();

【模拟输入输出信号,避免出现因缺少外设导致的信号传输失败,进而引发错误(模拟显示器、键盘、鼠标…)】

【java.awt.headless = true;】

SpringApplicationRunListeners listeners = this.getRunListeners(args);

【获取当前注册的可运行的监听器】

listeners.starting(bootstrapContext, this.mainApplicationClass);

【监听器执行了对应的操作步骤】

到这里其实还是一些准备性的工程,还没开始创建容器

ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);

【获取参数】

ConfigurableEnvironment environment = this.prepareEnvironment(listeners, bootstrapContext, applicationArguments);

【将前期读取的数据加载成了一个环境对象,用来描述信息】

this.configureIgnoreBeanInfo(environment);

【做了一个配置,备用】

Banner printedBanner = this.printBanner(environment);

【初始化启动图标】

context = this.createApplicationContext();

【创建容器对象,根据前期配置的容器类型进行判定并创建】

context.setApplicationStartup(this.applicationStartup);

【设置启动模式】

this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);

【对容器进行设置,参数来源于前期的设定】

this.refreshContext(context);

【刷新容器环境】

this.afterRefresh(context, applicationArguments);

【刷新完毕后,做后处理】

stopWatch.stop();

【计时结束】

if (this.logStartupInfo) {
    (new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);
}

【判定是否记录启动时间的日志】【创建日志对应的对象,输出日志信息,包含启动时间】

listeners.started(context);

【监听器执行了对应的操作步骤】

listeners.running(context);

【监听器执行了对应的操作步骤】

在这里插入图片描述

到这儿就结束了

OK, 回顾一下

  1. 初始化各种属性,加载成对象
  • 读取环境属性(Environment)
  • 系统配置(spring.factories)
  • 参数(Arguments、application.properties)
  1. 创建Spring容器对象ApplicationContext,加载各种配置
  2. 在容器创建前,通过监听器机制,应对不同阶段加载数据、更新数据的需求
  3. 容器初始化过程中追加各种功能,例如统计时间、输出日志等

【两个阶段】

【监听器类型】

  1. 在应用运行但未进行任何处理时,将发送 ApplicationStartingEvent。
  2. 当Environment被使用,且上下文创建之前,将发送 ApplicationEnvironmentPreparedEvent。
  3. 在开始刷新之前,bean定义被加载之后发送 ApplicationPreparedEvent。
  4. 在上下文刷新之后且所有的应用和命令行运行器被调用之前发送 ApplicationStartedEvent。
  5. 在应用程序和命令行运行器被调用之后,将发出 ApplicationReadyEvent,用于通知应用已经准备处理请求。
  6. 启动时发生异常,将发送 ApplicationFailedEvent
3.5.2 总结
  1. 理解过程有助于思考

李老师牛逼!!!!!!!!!!!!!!!!!!!!!【微服务我来啦!】

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

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

相关文章

剑指 Offer 10- I. 斐波那契数列

一、题目描述 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下: F(0) 0, F(1) 1 F(N) F(N - 1) F(N - 2), 其中 N > 1. 斐波那契数列由 0 和…

leetcode:6248. 统计中位数为 K 的子数组【问题转化 + 排序二分】

目录题目截图题目分析ac code总结题目截图 题目分析 找到k的位置然后一步步往左走,一步步往右走统计左边和右边的比当前k小的和比k大的lst [[small, big]],分为left和right两部分可以先一侧的单独看small和big,找到big - small 0或者1的即…

NETCONF、RESTCONF和YANG

目录 一、NETCONF、RESTCONF和YANG是之间什么关系? 二、Netconf简介 2.1、一般使用工具:MG-Soft 简介 三、Netconf YANG 原理与实践 3.1、NETCONF协议 3.2、YANG建模语言 3.3、RESTCONF协议 网管协议: SNMP(基于UDP&#…

C++员工考勤管理系统

目录 1 考勤管理系统的设计 1 1.1 需求分析 1 1.2 功能模块构成 1 1.3 数据库结构设计 2 2 考勤管理系统的实现 4 2.1 系统登陆功能的实现 4 2.2 基本信息管理模块 5 4.2.1 节假日信息管理 5 4.2.2 部门信息管理 6 4.2.3 员工信息管理 8 2.3 考勤管理模块 10 4.3.1 出勤信息管理…

怎么才能学会Python?

前言 新手小白学Python在还没有人带的情况下很容易半途而废,首先给大家总结一下我这两年Python的学习、开发经验遇到一些问题,大家首先得正视这些问题,因为超90%的人在初学Python时都会也遇到。 ①自学网上资料多,但质量参差不齐…

[报错解决](Error Creating bean with name ‘xxx‘)类问题解决思路

遇到Error Creating bean with name ’ 这类问题的解决思路 错误日志关键部分: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name productHandler: Unsatisfied dependency expressed through field productMap…

【vue】实现打印功能

文章目录一、vue-print-nb【1】安装【2】引用【3】API【4】示例代码【5】vue-print-nb插件的一些优化【6】注意事项:二、print.js :解决了无法打印本地图片的问题【1】安装【2】使用【3】注意点:三、lodop打印功能(可以指定打印机…

困于二手电商打转,转转拿什么“拯救世界”?

“双碳”战略下,转转集团也加入了,从数据上来看做得还可以。 都知道,近期转转集团试图向市场讲新故事。11月7日,转转集团在北京举办了品牌升级发布会,会上宣布其不再是一家互联网电商公司,而是定位在一家循…

爱心动画效果,教你如何更改颜色背景的爱心

如何运行该代码? 方法一: 1.创建一个.txt文件 2.把代码复制粘贴cv进去,并将其保存下来ctrls 3.改后缀名,将.txt改为.html 此时图标变了 4.此时点击,即可看见爱心效果 方法二: vscode dddd&#x1…

《数据结构》八大排序(详细图文分析讲解)

目录 排序 排序的应用 排序简介 排序的分类 排序算法的好坏评判 冒泡排序法 思路分析 代码实现 选择排序法 思路分析 代码实现 插入排序 思路分析 代码实现 希尔排序 思路分析 代码演示 归并排序法 思路分析 代码演示 快速排序 思路分析 代…

剑指Offer07.重建二叉树_解题思路代码实现

一、题目描述 输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 二、示例输入输出 示例1: Input: preorder [3,9,20,15,7], inorder [9,3,15,20,7] Output: [3,9…

LeetCode 1752. 检查数组是否经排序和轮转得到

思路&#xff1a;两段单调性均为递增 最多出现一次前大后小 代码&#xff1a; class Solution { public:bool check(vector<int>& nums) {int res 0;for (int i 0; i < nums.size(); i) if (nums[i] > nums[(i 1) % nums.size()]) res ;return res < 1…

Java中next()和nextLine()的区别(为什么nextLine()输入回车没显示)

一、问题描述&#xff1a; 前几天遇到了一个小问题&#xff1a;为了简化&#xff0c;我手打了一段简单的代码&#xff0c;如下&#xff1a; import java.util.Scanner;public class Test01 {public static void main(String[] args) {Scanner sc new Scanner(System.in);Sys…

kafka使用场景与设计原理

目录 1 kafka的介绍 2 架构 2.1 工作流程 2.2 副本原理 2.3 分区和主题的关系 2.4 生产者 2.4.1 为什么分区-可以水平扩展 2.4.2 分区策略 2.5 消费者 2.5.1 消费方式 2.5.2 分区分配策略 2.6 数据可靠性保证 2.6.1 副本数据同步策略 2.6.2 ACK 应答机制 2.6.3 …

MATPOWER下载安装教程

MATPOWER安装包官网下载链接&#xff1a; https://matpower.org/download/ 一、从官网下载后解压 点开解压后的文件&#xff0c;可以看到MATPOWER的安装包实际为一个程序包&#xff1a; 二、将MATPOWER放在bin目录下 将MATPOWER文件复制在C:\Program Files (x86)\MATLAB\R2…

植树节种树-第12届蓝桥杯Scratch选拔赛真题精选

[导读]&#xff1a;超平老师计划推出Scratch蓝桥杯真题解析100讲&#xff0c;这是超平老师解读Scratch蓝桥真题系列的第87讲。 蓝桥杯选拔赛每一届都要举行4~5次&#xff0c;和省赛、国赛相比&#xff0c;题目要简单不少&#xff0c;再加上篇幅有限&#xff0c;因此我精挑细选…

用DIV+CSS技术设计的红酒主题网站(web前端网页制作课作业)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【LeetCode144、145、94. 二叉树遍历】——递归算法、利用栈

144、145、94 二叉树遍历 这三道题分别考察二叉树的前序遍历、后序遍历、中序遍历。 二叉树的遍历问题是二叉树较为基础的一类问题&#xff0c;通常来讲&#xff0c;都是使用递归算法来实现的。而递归算法的关键就在于&#xff0c;确定递归函数的参数以及返回值、终止条件&am…

基于SqlNode的血缘解析

案例分析 基于社区当前最新版本calcite-1.32.0进行分析 当前的SqlValidatorTest$testFieldOrigin中有一个单测可以直接用来调试 调试后&#xff0c;很快就能在测试专用方法assertFieldOrigin找到SqlValidatorTest$getFieldOrigins这个血缘入口方法 public SqlValidatorFixtu…

AWR1843+DCA1000+mmwave_studio 采集原始数据

项目场景&#xff1a; AWR1843、DCA1000板与mmwave_studio的结合使用 实现数据采集工作 首先就是准备好各种相关的软件unfinish、matlabRuntime、mmwave_studio 没有涉及到css等 只是简单的数据采集工作。 问题1描述 在烧写完开箱demo后&#xff0c;开启mmwave_studio 出现找…