【SpringBoot3.0源码】启动流程源码解析 • 上

news2024/7/6 19:16:34

文章目录

  • 初始化

SpringBoot启动类:

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

步入SpringApplication.run(AppRun.class, args)方法:
这里分为两步:

  1. 创建一个SpringApplication实例:初始化一些配置(包括初始化对象和监听器以及一些配置文件)
  2. 调用run方法。
new SpringApplication(primarySources).run(args)

初始化

步入SpringApplication的构造方法中:

首先获取资源加载器、保存primarySources属性、web类型,设置初始化器和监听器,获取main方法所在的类

重点看一下获取初始化器和监听器这部分。

在这里插入图片描述
在此之前,看一下271行的代码:
在SpringBoot的老版本中,是没有这快代码的,这里主要是提前加载一些初始化器、监听器和其他配置放入缓存中,以便后续获取。

this.bootstrapRegistryInitializers = new ArrayList<>(
				getSpringFactoriesInstances(BootstrapRegistryInitializer.class));

步入getSpringFactoriesInstances方法中:

最终来到这里:这里首先构造一个加载器,再去调用load方法。

在这里插入图片描述
步入forDefaultResourceLocation方法:
最终来到这里:

注意332行代码:如果loaders这个map中有resourceLacation,则返回该key值对应的value。

当然,这里显然是没有的。所以会加载后面的函数,存入loaders中,并返回该值。
在这里插入图片描述
先看看loadFactoriesResource方法做了什么:

首先将项目中含有META-INFO/spring.factories的文件路径加载出来,这里有2个url,一个是autoconfigrition下的,一个是aop下的。

处理完之后去重。

最后收集到18个,包括初始化器和监听器等。

紧接着调用Collections.unmodifiableMap(result)方法。

在这里插入图片描述

看看Collections.unmodifiableMap(result)这个方法:

最后将map存入m这个属性中。

在这里插入图片描述
在这里插入图片描述

分析完SpringFactoriesLoader的参数了,来看看它的构造方法吧:

这样,factories就存入了我们加载出来的类。

在这里插入图片描述

构建完加载器,回去调用这个load方法:

在这里插入图片描述

步入loadFactoryNames方法:

最后会在m这个缓存中取值。

当然这里什么都没有,最后返回null。

在这里插入图片描述

回到最初这里:

在这里插入图片描述
后面两行代码,应该就很清晰了,因为调用的都是同一个getSpringFactoriesInstances方法,因为前者已经加载完配置文件,所以后面这里设置初始化器和监听器会从我们设置好的那个m缓存中获取。

setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));

值得注意的是,再次从m这个缓存中获取的时候,我们会取到值,那么这个for循环就会执行:

这里首先会通过反射创建该对象的实例,再add到result的List集合中。

在这里插入图片描述

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

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

相关文章

【暴力量化】查找最优均线

搜索逻辑 代码主要以支撑概率和压力概率来判断均线的优劣 判断为压力&#xff1a; 当日线与测试均线发生金叉或即将发生金叉后继续下行 判断为支撑&#xff1a; 当日线与测试均线发生死叉或即将发生死叉后继续上行 判断结果的天数&#xff1a; 小于6日均线&#xff0c;用金叉或…

Tensorflow中的多层感知器学习

Tensorflow中的多层感知器学习 在这篇文章中&#xff0c;我们将了解多层感知器的概念和它在Python中使用TensorFlow库的实现。 多层感知 多层感知也被称为MLP。它是完全连接的密集层&#xff0c;可以将任何输入维度转化为所需维度。多层感知是一个具有多层的神经网络。为了创…

【黑马SpringCloud(6)】Sentinel解决雪崩问题

微服务保护雪崩问题服务保护技术Sentinel微服务整合Sentinel流量控制簇点链路入门练习流控模式关联链路流控效果Warm Up排队等待热点参数限流隔离和降级FeignClient整合Sentinel线程隔离(舱壁模式)实现线程隔离熔断降级慢调用异常比例/异常数授权规则获取origin给网关添加请求头…

ROS2+nav2+激光雷达导航实践(上)

目录写在前面安装nav2nav2介绍nav2实践map地图保存地图读取状态估计(TF变换)所需TF坐标base_link -> sensor framesodom -> base_linkLaser Scan Matcher for ROS2map -> odomAMCL使用AMCL参数配置文件amcl_config.yaml效果过程中的知识点一、launch文件编写格式及方法…

Python 之 NumPy 切片索引和广播机制

文章目录一、切片和索引1. 一维数组2. 二维数组二、索引的高级操作1. 整数数组索引2. 布尔数组索引三、广播机制1. 广播机制规则2. 对于广播规则另一种简单理解一、切片和索引 ndarray 对象的内容可以通过索引或切片来访问和修改&#xff08;&#xff09;&#xff0c;与 Pytho…

30、基于51单片机交通灯车流量管控数码管显示系统设计

摘要 随着社会主义的建设&#xff0c;城市的规模在不断扩大&#xff0c;城市的交通也在不断的提高和改进&#xff0c;交通的顺畅已经成为制约社会主义建设的一个重要因素。目前&#xff0c;伴随着机动车辆的不断增加&#xff0c;尤其是十字路口的交通建设 颇为关键&#xff0c…

PID控制算法简介

目录 1 简介 2 比例Proportional 3 积分Integral 4 微分Differential 5 公式 6 积分限幅 7 积分限行 8 相关代码 1 简介 PID控制中有P、I、D三个参数&#xff0c;PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&#…

【渝偲医药】实验室关于核磁共振波谱NMR的知识(原理、用途、分析、问题)

核磁共振波谱法&#xff08;Nuclear Magnetic Resonance&#xff0c;简写为NMR&#xff09;与紫外吸收光谱、红外吸收光谱、质谱被人们称为“四谱"&#xff0c;是对各种有机和无机物的成分、结构进行定性分析的强有力的工具之一&#xff0c;亦可进行定量分析。 核磁共振&…

目标检测的旋框框文献学习

这是最近打算看完的文献&#xff0c;一天一篇 接下来将记录一下文献阅读笔记&#xff0c;避免过两天就忘了 RRPN 论文题目&#xff1a;Arbitrary-Oriented Scene Text Detection via Rotation Proposals 论文题目&#xff1a;通过旋转方案进行任意方向的场景文本检测&#x…

深度学习刷 SOTA 有哪些 trick?

“深度学习刷 SOTA 有哪些 trick&#xff1f;”&#xff0c;此问题在知乎上有超 1700 人关注&#xff0c;浏览量超 32 万&#xff0c;相信是大家都非常关心的问题&#xff0c;快一起看看下面的分享吧&#xff0c;希望可以帮助到大家~对于图像分类任务&#xff0c;让我们以 Swin…

阿里前端必会手写面试题汇总

实现节流函数&#xff08;throttle&#xff09; 节流函数原理:指频繁触发事件时&#xff0c;只会在指定的时间段内执行事件回调&#xff0c;即触发事件间隔大于等于指定的时间才会执行回调函数。总结起来就是&#xff1a; 事件&#xff0c;按照一段时间的间隔来进行触发 。 像d…

啪,还敢抛出异常

&#x1f649; 作者简介&#xff1a; 全栈领域新星创作者 &#xff1b;天天被业务折腾得死去活来的同时依然保有对各项技术热忱的追求&#xff0c;把分享变成一种习惯&#xff0c;再小的帆也能远航。 &#x1f3e1; 个人主页&#xff1a;xiezhr的个人主页 前言 去年又重新刷了…

DELL游匣ubuntu2004系统 RTX3060显卡,cuda11.4,cudnn8.2.4安装

1.安装Ubuntu2004的系统2.驱动安装前的准备工作第一步&#xff1a;修改设置下载源~阿里源。在Software Updater在第一栏Ubuntu Software页面中&#xff0c;找到Download from&#xff0c;选择->China->mirrors.aliyun.com,点击确认。第二步&#xff1a;sudo apt-get upda…

都说爱有回音,这次情人节驱动人生宠你!

来了来了&#xff0c;它又来了——那个一波人狂欢&#xff0c;一波人孤单的节日。 眼看着身边人在订花订餐厅&#xff0c;选礼物&#xff0c;空气中弥漫着微妙的氛围&#xff0c;驱动哥脑海里只有明天下班的地铁挤不挤得过这群约会的人。 不过根据哥的观察&#xff0c;发现一个…

【GlobalMapper精品教程】046:空间操作(3)——并集(Union)

本文讲解globalmapper空间操作中一种很重要的工具:并集。 文章目录 一、工具介绍1. 并集原理2. GM并集工具二、案例演示1. 加载数据2. 并集运算三、结果分析1. 空间变化2. 属性表变化3. 空间和属性对应关系一、工具介绍 1. 并集原理 并集(union)操作创建由两个输入图层的所…

80 90后表示真干不过,部门新来的00后已经把我卷奔溃了,不想干了····

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;刚开年我们公司来了个00后&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 …

操作系统开发:启用内存分页机制

目前我们已进入保护模式,但依然会受到限制,虽然地址空间达到了4GB,但此空间是包括操作系统共享的4GB空间&#xff0c;我们把段基址段内偏移地址称为线性地址&#xff0c;线性地址是唯一的&#xff0c;只属于某一个进程。在我们机器上即使只有512MB的内存&#xff0c;每个进程自…

开发微服务电商项目演示(四)

一&#xff0c;网关服务限流熔断降级第1步&#xff1a;启动sentinel-dashboard控制台和Nacos注册中心服务第2步&#xff1a;在网关服务中引入sentinel依赖<!-- sentinel --> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>sprin…

快速排序基本原理

快速排序基本原理1.快速排序1.1 基本原理1.2 快速排序执行步骤1.2.1 分区包含步骤1.2.1 分区步骤1.3 快速排序大O记法表示2. 将[0,5,2,1,6,3]进行快速排序 【实战】2.1 第一次分区步骤2.2 第二次分区步骤2.3 第三次分区步骤2.4 第四次分区步骤3.快速排序代码实现1.快速排序 1.…

一文盘点,ZBC的应用场景与通缩场景

进入到2023年&#xff0c;Zebec生态正在向新的叙事方向发展。一方面我们看到&#xff0c;流支付生态Zebec在此前正式走向DAO&#xff0c;并上线了DAO治理投票平台Zebec Node&#xff0c;任何持有ZBC的用户都可以参与投票。另一方面我们看到生态正在朝着最初的愿景迸发&#xff…