Spring 执行流程(源码)

news2025/4/9 12:14:02

我们对SpringApplication中的run()方法内部进行一些简单的分析

1.

//记录一下程序启动开始的事件,用于之后的统计耗时
long startTime = System.nanoTime();
//通过调用SpringApplication的**createBootstrapContext()**方法,创建**bootstrapContext**对象
DefaultBootstrapContext bootstrapContext = this.createBootstrapContext();
ConfigurableApplicationContext context = null;
//配置系统属性**java.awt.headless**,适用于没有显示器的服务器配置
this.configureHeadlessProperty();
//创建启动监听器
//starting方法通知所有的监听器,Spring Boot项目将启动,其实底层是调用EventPublishingRunListener通过多播机制来触发多个监听器的回调,意思就是一个事件可以通知多个监听器的执行
SpringApplicationRunListeners listeners = this.getRunListeners(args);
listeners.starting(bootstrapContext, this.mainApplicationClass);

扩展:然后我们在对 SpringApplication的createBootstrapContext()方法进行底层分析

//创建上下文context对象,遍历**bootstrapRegistryInitializers**中的每一个初始化器来对**bootstrapContext**进行初始化构造
private DefaultBootstrapContext createBootstrapContext() {

        DefaultBootstrapContext bootstrapContext = new DefaultBootstrapContext();
        this.bootstrapRegistryInitializers.forEach((initializer) -> {
            initializer.initialize(bootstrapContext);
        });
        return bootstrapContext;
}

 2.

 

//将args封装成ApplicationArguments
 主要是处理一些带前缀的选项参数(以--或-开头的参数,例如--port=8080)和非选项参数(没有前缀,例    如config.txt),就可以不用我们自己解析
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
//主要是准备并配置Spring Boot程序的环境
ConfigurableEnvironment environment = this.prepareEnvironment(listeners, bootstrapContext, applicationArguments);
this.configureIgnoreBeanInfo(environment);
Banner printedBanner = this.printBanner(environment);
//- 创建ApplicationContext上下文,启动监听器,收集应用启动过程中的数据
- prepareContext方法底层配置环境,注入依赖,调用初始化器,发布事件监听等功能
context = this.createApplicationContext();
context.setApplicationStartup(this.applicationStartup);
this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
//启动Spring核心容器,完成Bean的初始化,然后进行回调,执行一些自定义的逻辑
this.refreshContext(context);
this.afterRefresh(context, applicationArguments);
Duration timeTakenToStartup = Duration.ofNanos(System.nanoTime() - startTime);
if (this.logStartupInfo) {
    (new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(),                 
     timeTakenToStartup);
}
//通知监听器,应用程序启动完成
listeners.started(context, timeTakenToStartup);

扩展:其中 看一下prepareEnvironment方法

  • 通过getOrCreateEnvironment方法 创建ConfigurableEnvironment,配置环境属性

  • attach底层实现就是确保数据源的一致性和更新,然后将最新的数据源放到优先的位置

  • 之后listeners会发布(触发)一个环境准备完毕的事件

  • 然后将新的配置源附加到Spring的环境中

3.最后条用实现CommandLineRunner和ApplicationRunner接口的Bean,两个接口在应用程序启动完成后执行一些初始化逻辑

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

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

      相关文章

      安装完 miniconda3 ,cmd无法执行 conda 命令

      提示:安装 miniconda3 文章目录 前言一、安装二、安装完,cmd 无法执行 conda 前言 提示:版本 系统:win10 codna: miniconda3 安装完 miniconda3 ,cmd无法执行 conda 命令 提示:以下是本篇文章正文内容&am…

      Docker快速安装MongoDB并配置主从同步

      目录 一、创建相关目录及授权 二、下载并运行MongoDB容器 三、配置主从复制 四、客户端远程连接 五、验证主从同步 六、停止和恢复复制集 七、常用命令 一、创建相关目录及授权 创建主节点mongodb数据及日志目录并授权 mkdir -p /usr/local/mongodb/mongodb1/data mkdir …

      Golang系列 - 内存对齐

      Golang系列-内存对齐 常见类型header的size大小内存对齐空结构体类型参考 摘要: 本文将围绕内存对齐展开, 包括字符串、数组、切片等类型header的size大小、内存对齐、空结构体类型的对齐等等内容. 关键词: Golang, 内存对齐, 字符串, 数组, 切片 常见类型header的size大小 首…

      网络原理 - HTTP/HTTPS

      1. HTTP 1.1 HTTP是什么? HTTP (全称为 “超文本传输协议”) 是⼀种应用非常广泛的应用层协议. HTTP发展史: HTTP 诞生于1991年. 目前已经发展为最主流使用的⼀种应用层协议 最新的 HTTP 3 版本也正在完善中, 目前 Google / Facebook 等公司的产品已经…

      OCC Shape 操作

      #pragma once #include <iostream> #include <string> #include <filesystem> #include <TopoDS_Shape.hxx> #include <string>class GeometryIO { public:// 加载几何模型&#xff1a;支持 .brep, .step/.stp, .iges/.igsstatic TopoDS_Shape L…

      深度学习入门(四):误差反向传播法

      文章目录 前言链式法则什么是链式法则链式法则和计算图 反向传播加法节点的反向传播乘法节点的反向传播苹果的例子 简单层的实现乘法层的实现加法层的实现 激活函数层的实现ReLu层Sigmoid层 Affine层/SoftMax层的实现Affine层Softmax层 误差反向传播的实现参考资料 前言 上一篇…

      Linux:页表详解(虚拟地址到物理地址转换过程)

      文章目录 前言一、分页式存储管理1.1 虚拟地址和页表的由来1.2 物理内存管理与页表的数据结构 二、 多级页表2.1 页表项2.2 多级页表的组成 总结 前言 在我们之前的学习中&#xff0c;我们对于页表的认识仅限于虚拟地址到物理地址转换的桥梁&#xff0c;然而对于具体的转换实现…

      PostgreSQL 一文从安装到入门掌握基本应用开发能力!

      本篇文章主要讲解 PostgreSQL 的安装及入门的基础开发能力,包括增删改查,建库建表等操作的说明。navcat 的日常管理方法等相关知识。 日期:2025年4月6日 作者:任聪聪 一、 PostgreSQL的介绍 特点:开源、免费、高性能、关系数据库、可靠性、稳定性。 官网地址:https://w…

      WEB安全--内网渗透--LMNTLM基础

      一、前言 LM Hash和NTLM Hash是Windows系统中的两种加密算法&#xff0c;不过LM Hash加密算法存在缺陷&#xff0c;在Windows Vista 和 Windows Server 2008开始&#xff0c;默认情况下只存储NTLM Hash&#xff0c;LM Hash将不再存在。所以我们会着重分析NTLM Hash。 在我们内…

      8.用户管理专栏主页面开发

      用户管理专栏主页面开发 写在前面用户权限控制用户列表接口设计主页面开发前端account/Index.vuelangs/zh.jsstore.js 后端Paginator概述基本用法代码示例属性与方法 urls.pyviews.py 运行效果 总结 欢迎加入Gerapy二次开发教程专栏&#xff01; 本专栏专为新手开发者精心策划了…

      室内指路机器人是否支持与第三方软件对接?

      嘿&#xff0c;你知道吗&#xff1f;叁仟室内指路机器人可有个超厉害的技能&#xff0c;那就是能和第三方软件 “手牵手” 哦&#xff0c;接下来就带你一探究竟&#xff01; 从技术魔法角度看哈&#xff1a;好多室内指路机器人都像拥有超能力的小魔法师&#xff0c;采用开放式…

      从代码上深入学习GraphRag

      网上关于该算法的解析都停留在大概流程上&#xff0c;但是具体解析细节未知&#xff0c;由于代码是PipeLine形式因此阅读起来比较麻烦&#xff0c;本文希望通过阅读项目代码来解析其算法的具体实现细节&#xff0c;特别是如何利用大模型来完成图谱生成和检索增强的实现细节。 …

      【Redis】通用命令

      使用者通过redis-cli客户端和redis服务器交互&#xff0c;涉及到很多的redis命令&#xff0c;redis的命令非常多&#xff0c;我们需要多练习常用的命令&#xff0c;以及学会使用redis的文档。 一、get和set命令&#xff08;最核心的命令&#xff09; Redis中最核心的两个命令&…

      微前端随笔

      ✨ single-spa&#xff1a; js-entry 通过es-module 或 umd 动态插入 js 脚本 &#xff0c;在主应用中发送请求&#xff0c;来获取子应用的包&#xff0c; 该子应用的包 singleSpa.registerApplication({name: app1,app: () > import(http://localhost:8080/app1.js),active…

      C++中的浅拷贝和深拷贝

      浅拷贝只是将变量的值赋予给另外一个变量&#xff0c;在遇到指针类型时&#xff0c;浅拷贝只会把当前指针的值&#xff0c;也就是该指针指向的地址赋予给另外一个指针&#xff0c;二者指向相同的地址&#xff1b; 深拷贝在遇到指针类型时&#xff0c;会先将当前指针指向地址包…

      车载诊断架构 --- 整车重启先后顺序带来的思考

      我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…

      【C++11(下)】—— 我与C++的不解之缘(三十二)

      前言 随着 C11 的引入&#xff0c;现代 C 语言在语法层面上变得更加灵活、简洁。其中最受欢迎的新特性之一就是 lambda 表达式&#xff08;Lambda Expression&#xff09;&#xff0c;它让我们可以在函数内部直接定义匿名函数。配合 std::function 包装器 使用&#xff0c;可以…

      Windows 10/11系统优化工具

      家庭或工作电脑使用时间久了&#xff0c;会出现各种各样问题&#xff0c;今天给大家推荐一款专为Windows 10/11系统设计的全能优化工具&#xff0c;该软件集成了超过40项专业级实用程序&#xff0c;可针对系统性能进行深度优化、精准调校、全面清理、加速响应及故障修复。通过系…

      浅谈在HTTP中GET与POST的区别

      从 HTTP 报文来看&#xff1a; GET请求方式将请求信息放在 URL 后面&#xff0c;请求信息和 URL 之间以 &#xff1f;隔开&#xff0c;请求信息的格式为键值对&#xff0c;这种请求方式将请求信息直接暴露在 URL 中&#xff0c;安全性比较低。另外从报文结构上来看&#xff0c…

      LightRAG实战:轻松构建知识图谱,破解传统RAG多跳推理难题

      作者&#xff1a;后端小肥肠 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; 2025防失业预警&#xff1a;不会用DeepSeek-RAG建知识库的人正在被淘汰_deepseek-embedding-CSDN博客 从PDF到精准答案&#xff1a;Coze…