SpringBoot启动原理详解(二)

news2024/12/25 10:32:24

透彻理解SpringBoot启动原理(二)

  • 照旧一张Spring启动顺序图
    • 我们对Spring启动原理有多少理解呢(问题回顾)
    • 关于Spring启动原理的若干问题
        • 1.init-method、PostConstruct、afterPropertiesSet 三个方法的执行顺序。
        • 2.Spring 何时装配Autowire属性,PostConstruct方法中引用 Autowired 字段是否会空指针?
        • 3.PostConstruct 中方法依赖ApplicationContextAware拿到 ApplicationContext,两者的顺序谁先谁后?是否会出现空指针!
        • 4.项目应该如何监听 Spring 的启动就绪事件。
        • 5.项目如何监听Spring 刷新事件。
        • 6.Spring就绪事件和刷新事件的执行顺序和区别。
        • 7.Http 流量入口何时启动完成。
        • 8.项目中在 init-method 方法中注册 Rpc是否合理?什么是时候注册最合理?
        • 9.项目中在 init-method 方法中注册 MQ消费组是否合理?什么是合理的时机?
        • 1.Spring还未完全启动,在 PostConstruct 中调用 getBeanByAnnotation能否获得准确的结果?
    • 深入源码
        • 看一下源码中,Spring初始化单例Bean和SmartInitializingSingleton的位置
        • Autowired何时装配Bean的依赖
        • SpringBoot何时开启Http端口
        • SpringBoot初始化Bean的关键代码
      • 汇总

照旧一张Spring启动顺序图

Hellow! 这次再看这张图,请认真回顾下第一篇所讲解的启动顺序,打破遗忘曲线,我们再一次一起看一下这张 Spring启动顺序图
在这里插入图片描述

我们对Spring启动原理有多少理解呢(问题回顾)

我在这里为大家准备了一些很细节但贯穿整个spring启动流程的常见问题:

  1. Spring常见的流量入口有哪些?
  2. SpringBoot集成Tomcat,如果Http流量先进入了,此时Spring还未启动完成,怎么办?那Tomcat是何时开启端口对外服务的呢?
  3. Spring集成RPC框架,RPC框架何时注册暴露服务,在Spring那个扩展点注册呢?
  4. Spring集成MQ消费组,MQ消费者何时开始消费,在Spring那个扩展点“注册消费者”?
  5. Spring还未完全启动,在 PostConstruct 中调用 getBeanByAnnotation 能否获得准确的结果?;
  6. 项目应该如何监听 Spring 的启动就绪事件?项目如何监听Spring 刷新事件?
  7. Spring就绪事件和刷新事件的执行顺序和区别?
  8. Http 流量入口何时启动完成?
  9. PostConstruct 中方法依赖ApplicationContextAware拿到 ApplicationContext,两者的顺序谁先谁后?是否会出现空指针!
  10. init-method、PostConstruct、afterPropertiesSet 三个方法的执行顺序?
    如上10个问题,作为在Spring框架中苦苦挣扎的你,能理解并解答出几个呢?

关于Spring启动原理的若干问题

----------------------还记得(一)中打印顺序的图吗,请记好!!
还记得(一)中打印顺序的图吗,请记好!!

1.init-method、PostConstruct、afterPropertiesSet 三个方法的执行顺序。

PostConstruct,afterPropertiesSet,init-method

2.Spring 何时装配Autowire属性,PostConstruct方法中引用 Autowired 字段是否会空指针?

Autowired装配依赖发生在 PostConstruct之前,不会出现空指针!

3.PostConstruct 中方法依赖ApplicationContextAware拿到 ApplicationContext,两者的顺序谁先谁后?是否会出现空指针!

ApplicationContextAware 会先执行,不会出现空指针!但是当Autowired没有找到对应的依赖,并且声明了非强制依赖时,该字段会为空,有潜在 空指针风险。

4.项目应该如何监听 Spring 的启动就绪事件。

通过SmartLifecyle start方法,监听Spring就绪 。适合在此开启入口流量!

5.项目如何监听Spring 刷新事件。

监听 Spring Event ContextRefreshedEvent

6.Spring就绪事件和刷新事件的执行顺序和区别。

Spring就绪事件会先于 刷新事件。两者都可能多次执行,要确保方法的幂等处理,避免重复注册问题

7.Http 流量入口何时启动完成。

SpringBoot 最后阶段,启动完成Spring 上下文,才开启Http入口流量,此时 SmartLifecycle#start 已执行。所有单例Bean和SpringEvent等组件都已经就绪!

8.项目中在 init-method 方法中注册 Rpc是否合理?什么是时候注册最合理?

init 开启Rpc流量非常不合理。因为Spring尚未启动完成,包括 Spring Event尚未就绪!在SmartInitializingSingleton后

9.项目中在 init-method 方法中注册 MQ消费组是否合理?什么是合理的时机?

init 开启 MQ 流量非常不合理。因为Spring尚未启动完成,包括 Spring Event尚未就绪!在SmartInitializingSingleton后

1.Spring还未完全启动,在 PostConstruct 中调用 getBeanByAnnotation能否获得准确的结果?

虽然未启动完成,但是Spring执行该getBeanByAnnotation方法时,会率先检查 Bean定义,如果Bean定义对应的 Bean尚未初始化,则初始化这些Bean。所以即便是Spring初始化过程中调用,调用结果是准确的。

深入源码

看一下源码中,Spring初始化单例Bean和SmartInitializingSingleton的位置

在这里插入图片描述

Autowired何时装配Bean的依赖

在Bean实例化之后,但初始化之前,AutowiredAnnotationBeanPostProcessor 会注入Autowired字段。

SpringBoot何时开启Http端口

SpringBoot会首先启动 Spring上下文,完成后才启动 嵌入式Web容器,初始化SpringMVC,监听端口
在这里插入图片描述

SpringBoot初始化Bean的关键代码

AbsractAutowireCapableBeanFactory -->initializeBean()
在这里插入图片描述

汇总

SpringBoot 会在Spring完全启动完成后,才开启Http流量。这给了我们启示:应该在Spring启动完成后开启入口流量。
Rpc和 MQ流量 也应该如此,所以建议大家 在 SmartLifecype 或者 ContextRefreshedEvent 等位置 注册服务,开启流量。

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

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

相关文章

【C语言】数组栈的实现

栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈&#…

在图神经网络(GNN)上进行关系推理的新架构

开发能够学习推理的模型是一个众所周知的具有挑战性的问题,在这个领域中,使用图神经网络(GNNs)似乎是一个自然的选择。然而,以往关于使用GNNs进行推理的工作表明,当这些模型面对需要比训练时更长推理链的测…

听见未来,AI+Audio|2025中国国际音频产业大会(GAS)

随着AI技术的创新与突破, 音频行业正步入前所未有的黄金发展期。 2025中国国际音频产业大会, “AI对行业发展的影响” 将成为讨论的热点之一。 3月26-27日,2025中国国际音频产业大会(GAS)将在上海 张江科学会堂召…

Conda和Pip有什么区别?

conda和pip是Python中两种常用的包管理工具,它们在用途、包来源以及环境管理等方面存在区别。以下是具体分析: 用途 conda:conda是Anaconda发行版中的包管理工具,可以管理包括非Python软件包在内的各种包。它是一个全面的环境管理…

【iOS】GCD

参考文章:GCD函数和队列原理探索 之前写项目的时候,进行耗时的网络请求使用GCD处理过异步请求,但对一些概念都很模糊,这次就来系统学习一下GCD相关 相关概念 什么是GCD? Grand Center Dispatch简称GCD,是…

python-docx 如何将列表中的值提取到段落中的run以及保存为多个文档?

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

使用pfld模型进行表盘读数检测

目录 1. 下载项目和数据集2. 配置环境3. 训练和测试3.1 训练3.2 测试 4. 参考 使用pfld模型对压力表进行读表检测 1. 下载项目和数据集 下载项目: git clone https://github.com/zhouayi/pfld.git下载数据集: wget https://github.com/zhouayi/pfld/r…

Vue3扁平化Tree组件的前端分页实现

大家好,我是小卷。得益于JuanTree的扁平化设计,在数据量很大的情况下除了懒加载,使用前端分页也是一种解决渲染性能问题的可选方案。 用法 要实现的文档: 分页效果: 实现 新增属性: 组件setup方法中新增…

java 对象模型的个人理解

文章目录 一、OOP-KCLASS 模型二、疑惑2.1 为什么还需要一个 Class对象?2.2 new 关键字和 Class.newInstance() 的区别? 一、OOP-KCLASS 模型 java 采用了field和method分离的方式,field组成实例 obj ,存储在堆区,而m…

web小项目-曼波生日录(Servlet+JSP+MySQL)

效果演示: 当记录条数过多时会自动出现滚轮,数据不会超出紫框 数据库实时记录: 项目源代码以及所用到的资源: 链接: https://pan.baidu.com/s/1w0czmH9xBfetk7CZ7RNbtQ?pwd6666 提取码: 6666 复制这段内容后打开百度网盘手机App…

【数据结构】堆,优先级队列

目录 堆堆的性质大根堆的模拟实现接口实现构造方法建堆入堆判满删除判空获取堆顶元素 Java中的PriorityQueue实现的接口构造方法常用方法PriorityQueue注意事项 练习 堆 如果有一个集合K {k0,k1, k2,…,kn-1},把它的…

Listen(sockfd,backlog)监听函数的第二个参数到底是什么?深度解释

listen队列剖析 int listen(int sockfd,int backlog) backlog : 监听套接字队列 对于一个调用监听的套接字,系统会维护给这个套接字两个队列 1. 未完成连接队列 //当客户端发生三次握手的第一次syn包给服务器的时候,服务器就会再未完成队列中创建…

数据库处理表

首先先创建库,然后创建需要的这三个表 用dese表名查看 然后题目要求对表进行修改 用alter table这个语法来对表进行修改 modify为修改字段 需要修改的字段的属性类型改变为的属性 最后用descStudent查看 第二题需要创建索引 创建索引createindex索引名称 cre…

世界启动Ⅷ--AI视频制作-方案与创新

1.文本/图片生成视频顾名思义,就是输入一段文本描述/上传一张图片即可生成对应的视频。我们常见的Runway、Pika、NeverEnds、Pixverse、svd等都属于此类。比如runway的影视风格Pika的动漫风格NeverEnds的人像模特当然还有一些外延应用,例如最近比较火的阿…

C++客户端Qt开发——Qt窗口(工具栏)

2.工具栏 使用QToolBar表示工具栏对象&#xff0c;一个窗口可以有多个工具栏&#xff0c;也可以没有&#xff0c;工具栏往往也可以手动移动位置 ①设置工具栏 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QToolBar> #include<…

JavaSE--基础语法--继承和多态(第三期)

一.继承 1.1我们为什么需要继承? 首先&#xff0c;Java中使用类对现实世界中实体来进行描述&#xff0c;类经过实例化之后的产物对象&#xff0c;则可以用来表示现实中的实体&#xff0c;但是 现实世界错综复杂&#xff0c;事物之间可能会存在一些关联&#xff0c;那在设计程…

开发AI自动直播工具需要了解的源代码!

随着人工智能技术的快速发展&#xff0c;AI自动直播工具成为了现代直播领域的一大创新&#xff0c;这些工具利用先进的算法和机器学习模型&#xff0c;能够自动化地生成、编辑和播出直播内容&#xff0c;极大地提高了直播的效率和质量。 然而&#xff0c;要开发一款功能强大的…

10 个顶级的PPT生成AI工具盘点,一文把所有好用软件尽收囊中!

你是否希望在工作中制作 PPT 演示文稿&#xff0c;与他人分享你的洞见&#xff0c;或是发表演讲&#xff1f;然而&#xff0c;使用传统的 PPT 制作方式既耗时又费力&#xff0c;步入 AI 时代后&#xff0c;人们寻求更智能、更简便的 PPT 演示文稿制作方法。 目前市场上出现了一…

谷粒商城实战笔记-65-商品服务-API-品牌管理-表单校验自定义校验器

文章目录 1&#xff0c;el-form品牌logo图片自定义显示2&#xff0c;重新导入和注册element-ui组件3&#xff0c;修改brand-add-or-update.vue控件的表单校验规则firstLetter 校验规则sort 校验规则 1&#xff0c;el-form品牌logo图片自定义显示 为了在品牌列表中自定义显示品…

本地部署VMware ESXi服务实现无公网IP远程访问管理服务器

文章目录 前言1. 下载安装ESXi2. 安装Cpolar工具3. 配置ESXi公网地址4. 远程访问ESXi5. 固定ESXi公网地址 前言 在虚拟化技术日益成熟的今天&#xff0c;VMware ESXi以其卓越的性能和稳定性&#xff0c;成为了众多企业构建虚拟化环境的首选。然而&#xff0c;随着远程办公和跨…