springboot启动流程梳理

启动顺序主要针对SpringApplication.run()方法的梳理

一 SpringApplication类的实例化

  1. ApplicationContextInitializer 实现类的资源配置文件读取以及实现相关类的实例化
    1).加载 ApplicationContextInitializer 实现类 ,由 SpringFactoriesLoader 类加载定义在 META-INF/spring.factories 文件夹下的配置文件Resource 初始化资源列表 Map<ClassLoader, MultiValueMap<String, String>>
    2).加载实例化ApplicationContextInitializer 的实现类

  2. ApplicationListener 接口类的资源配置文件的读取以及实例化
    1).加载 ApplicationListener 实现类 ,由 SpringFactoriesLoader 类加载定义在 META-INF/spring.factories 文件夹下的配置文件Resource 初始化资源列表 Map<ClassLoader, MultiValueMap<String, String>>
    2) ApplicationListener 的实现类

二 SpringApplication.run()启动方法

  1. SpringApplicationRunListeners的实例化以及相关实现类的调用
    1).实例化 SpringApplicationRunListeners,启动 SpringApplicationRunListeners的监听
    由 SpringFactoriesLoader 类加载 SpringApplicationRunListeners 实现类 ,定义在 META-INF/spring.factories 文件夹下的配置文件Resource 初始化资源列表 Map<ClassLoader, MultiValueMap<String, String>>
    2).遍历调用所有SpringApplicationRunListeners的starting方法,实现实现类接口的初始化
  2. 实例化 ConfigurableEnvironment ,由listeners,bootstrapContext,applicationArguments设置启动springboot启动的环境配置信息
  3. 打印Banner
  4. 创建ConfigurableApplicationContext类
  5. 创建加载SpringBootExceptionReporter
    1).加载 创建加载SpringBootExceptionReporter 实现类 ,定义在 META-INF/spring.factories 文件夹下的配置文件Resource 初始化资源列表 Map<ClassLoader, MultiValueMap<String, String>>
    2).创建加载SpringBootExceptionReporter 的实现类
  6. 初始化容器prepareContext
    根据初始化的ConfigurableApplicationContext、ConfigurableEnvironment、SpringApplicationRunListeners、ApplicationArguments、Banner 准备初始化上下文context
    1) 设置实现ApplicationContextInitializer 的实现类的context属性
    2) 设置listener的context属性
    3)设置beanFactory 的属性 ,加载bean的时候是否循环依赖allowCircularReferences
    4) 设置beanFactory的属性 ,加载bean 时候是否允许同名bean的覆盖属性allowBeanDefinitionOverriding,springboot默认false
    5) 设置context 属性 lazyInitialization ,配置是否延迟加载懒加载的bean。
    6) 创建加载bean的BeanDefinitionLoader。和定义bean 加载时候的resourceLoader,environment

懒加载的bean配合@Lazy注解使用。懒加载好处:
节省资源:当应用程序中存在大量的 bean 时,立即初始化所有 bean 可能会占用大量的内存和处理时间。通过延迟初始化,只有在需要使用 bean 时才会进行初始化,可以避免不必要的资源消耗。
加快启动时间:延迟初始化可以减少应用程序启动时间,因为只有在需要时才会加载和初始化
bean。对于那些在应用程序启动时可能不会使用的较大或复杂的 bean,延迟初始化可以显著加快启动时间。
解决循环依赖: Spring 容器可以管理bean之间的依赖关系。当存在循环依赖时,延迟初始化可以帮助解决这个问题。通过延迟初始化,Spring
容器可以在运行时逐个解析和满足 bean 之间的依赖,而不是在初始化阶段发现无法解决的循环依赖。

  1. 更新上下文 refreshContext
    1) 通过registerShutdownHook 钩子方法判断容器是进行开启还是关闭
    2) 给beanFactory进行refresh()
    (1) 设置BeanFactory的后置处理器,实现了BeanFactoryPostProcessor接口
    (2)设置bean的后置处理器,实现了BeanPostProcessor接口
    (3) 初始化国际化资源,实现了HierarchicalMessageSource接口
    (4)初始化spring容器实践,实现了ApplicationEventMulticaster接口
    (5)onRefresh() 更新主题资源,实现了HierarchicalThemeSource接口, 创建ServletContext
    (6)注册监监听事件ApplicationListener事件,获取ApplicationListener实现接口集合,执行广播监听(ApplicationEventMulticaster接口实现类),执行对应的excute方法;执行 listener.onApplicationEvent(event)方法;
    (7)加载通过字节码载入字节码文件时动态织入Aspect切面,LoadTimeWeaverAware接口
    (8) 加载实例化LifecycleProcessor接口,调用start/stop相关接口
    在Spring中还提供了Lifecycle接口,Lifecycle接口中包含start/stop方法,实现此接口后Spring会保证在启动的时候调用其start方法开始生命周期,并在Spring关闭的时候调用stop方法来结束生命周期,通常用来配置后台程序,如启动后一直运行(如对MQ进行轮询等)。而ApplicationContext的初始化最后一步就是保证了这一功能的实现。
    (9) 调用ContextRefreshedEvent 事件机制,实现ApplicationContextEvent实现ApplicationEvent 抽象类
  2. 打印启动日志 logStartupInfo
  3. 执行接口事件、ApplicationRunner、CommandLineRunner接口事件集合

springboot 启动流程图

在这里插入图片描述

springboot 创建上下文 createApplicationContext 过程

在这里插入图片描述

springboot 扩展点详解

参考:https://blog.csdn.net/fox9916/article/details/129101918

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RBTree模拟实现

一、概念 概念&#xff1a;红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出俩倍&a…

Matplotlib | 高阶绘图案例【3】- 五大战区高校排名

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. 数据处理2.1 高效数据2.2 学校排名 &#x1f3f3;️‍&#x1f308; 3. 绘图3.1 绘制图布&#xff0c;设置极坐标系3.2 绘制学校排名柱状图3.3 绘制五大战区扇形区域3.4 添加战区、学校…

前端面试经典题--页面布局

题目 假设高度已知&#xff0c;请写出三栏布局&#xff0c;其中左、右栏宽度各为300px&#xff0c;中间自适应。 五种解决方式代码 浮动解决方式 绝对定位解决方式 flexbox解决方式 表格布局 网格布局 源代码 <!DOCTYPE html> <html lang"en"> <…

Python之数据库(MYSQL)连接

一&#xff09;数据库SQL语言基础 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database…

EPICS电机支持(asynMotor)

EPICS电机支持 1&#xff09; 顶层对象是EPICS motor记录 已经对这个对象编写了很多代码&#xff1a;spec&#xff0c;IDL和Python类等 2&#xff09;下一层是EPICS设备支持 了解motor记录&#xff0c;与驱动会话 3&#xff09;最底层是EPICS驱动 对motor记录一无所知&am…

Mac系统 AndroidStudio Missing essential plugin:org.jetbrains.android报错

打开Android Studio,提示 Missing essential plugin:org.jetbrains.android错误&#xff0c;产生的原因是Kotlin被禁用。 解决的方法是删除disabled_plugins.txt&#xff0c;Mac OS对应的路径为&#xff1a; /Users/xzh/Library/Application Support/Google/AndroidStudio202…

Azure + React + ASP.NET Core 项目笔记一:项目环境搭建(二)

有意义的标题 pnpm 安装umi4 脚手架搭建打包语句变更Visual Studio调试Azure 设置变更发布 pnpm 安装 参考官网&#xff0c;或者直接使用npm安装 npm install -g pnpmumi4 脚手架搭建 我这里用的umi4&#xff0c;官网已附上 这里需要把clientapp清空&#xff0c;之后 cd Cl…

CG MAGIC分享3d Max中的Corona渲染器材质如何成转换VRay材质?

大家无论是使用Corona渲染器还是Vray渲染器时&#xff0c;进行材质问题时&#xff0c;都会遇到转化材质问题。 如何将CR转换成VR或者将VR转换CR材质呢&#xff1f; 对于这两者之间转换最好最好的方法只能是材质转换器。 CG MAGIC小编&#xff0c;梳理了两种方法&#xff0c;大…

JVM垃圾回收器

收集算法是内存回收的方法论&#xff0c;垃圾收集器就是内存回收的具体实现。收集器主要分三类&#xff1a;串行收集器、并行收集器以及并发收集器。 一、基础概念 1、并发和并行 a&#xff1a;并行&#xff08;Parallel&#xff09;&#xff1a;指多条垃圾收集线程并行工作&…

【漏洞复现】E-office文件包含漏洞

漏洞描述 Weaver E-Office是中国泛微科技(Weaver)公司的一个协同办公系统。泛微 E-Office 是一款标准化的协同 OA 办公软件,实行通用化产品设计,充分贴合企业管理需求,本着简洁易用、高效智能的原则,为企业快速打造移动化、无纸化、数字化的办公平台。 该漏洞是由于存在…

MATLAB R2018b安装教程

目录 一、软件下载 二、软件介绍 三、安装须知 四、安装步骤 【最后】 &#x1f388;个人主页&#xff1a;库库的里昂 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;MATLAB基础及应用&#x1f91d;希望作者的文章能…

从9.10拼多多笔试第四题产生的01背包感悟

文章目录 题面基本的01背包问题本题变式 本文参考&#xff1a; 9.10拼多多笔试ak_牛客网 (nowcoder.com) 拼多多 秋招 2023.09.10 编程题目与题解 (xiaohongshu.com) 题面 拼多多9.10笔试的最后一题&#xff0c;是一道比较好的01背包变式问题&#xff0c;可以学习其解法加深对…