【日积月累】SpringBoot启动流程

news2024/11/19 1:46:02

主图==========

目录

SpringBoot启动流程

  • 1.前言
  • 2.构造一个SpringApplication的实例,完成初始化的工作
  • SpringApplication实例构造完之后调用run方法,启动SpringApplication
  • 3.SpringBoot启动代码
    • @SpringBootConfiguration
    • @ComponentScan
    • @EnableAutoConfiguration
  • 总结
  • 参考


文章所属专区 日积月累


1.前言

SpringBoot启动流程,一个容易被忽略的问题,包含非常多的知识。主要分为两部
1.构造一个SpringApplication的实例,完成初始化工作
2.SpringApplication实例构造完之后调用run方法,启动SpringApplication

2.构造一个SpringApplication的实例,完成初始化的工作

  1. 创建并初始化ApplicationInitializer,设置到initializers属性中 。
  2. 创建并初始化ApplicationListener,设置到listeners属性中 。

SpringApplication实例构造完之后调用run方法,启动SpringApplication

  1. 创建并初始化计时器StopWatch,用来记录SpringBoot的启动时间 。
  2. 创建并初始化监听器SpringApplicationRunListeners,并启动监听,用于监听run方法的执行。
  3. 创建并初始化ApplicationArguments,获取run方法传递的args参数。
  4. 创建并初始化环境配置ConfigurableEnvironment。封装main方法的参数,写入到 Environment中,发布 ApplicationEnvironmentPreparedEvent(环境事件)。

3.SpringBoot启动代码

每个SpringBoot程序都有一个主入口,也就是main方法,main方法里面调用SpringApplication.run()启动整个SpringBoot程序,该方法所在类需要使用***@SpringBootApplication***注解,这个类实际可以看做是由@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan 三个注解组成

在这里插入图片描述

@SpringBootConfiguration

实际上就是一个@Configuration ,它的作用是把当前类作为一个配置类交给Spring中的IOC容器进行管理。

@ComponentScan

用于定义Spring扫描的路径,等价于在xml中配置 context:component-scan,如果不配置扫描路径,则默认扫描当前类所在的包以及子包中标注了@Controller @Service @Component等注解的类

@EnableAutoConfiguration

是实现自动装配的关键。它是由@AutoConfigurationPackage 和@Import组成的复合注解

总结

1、调用有@SpringBootApplication注解的启动类的main方法
2、通过调用SpringApplication内部的run()方法构建SpringApplication对象。
创建SpringApplication对象:
2.1 PrimarySources 不为空,将启动类赋值给primarySources 对象。
2.2 从classpath类路径推断Web应用类型,有三种Web应用类型NONE、SERVLET、REACTIVE
2.3 初始化bootstrapRegistryInitializers
2.4 初始化ApplicationContextInitializer集合
2.5 初始化ApplicationListener
2.6 获取StackTraceElement数组遍历,通过反射获取堆栈中有main方法A的。
3、调用SpringBootApplication的run方法。
4、long startTime = System.nanoTime(); 记录项目启动时间。
5、通过BootstrapRegistryInitializer来初始化DefaultBootstrapContext
6、getRunListeners(args)获取SpringApplicationRunListeners监听器
7、 listeners.starting()触发ApplicationStartingEvent事件
8、prepareEnvironment(listeners, bootstrapContext, applicationArguments) 将配置文件读取到容器中,返回ConfigurableEnvironment 对象。
9、printBanner(environment) 打印Banner图,即SpringBoot启动时的图案。
10、根据WebApplicationType从ApplicationContextFactory工厂创建ConfigurableApplicationContext,并设置ConfigurableApplicationContext中的ApplicationStartup为DefaultApplicationStartup
11、 调用prepareContext()初始化context等,打印启动日志信息,启动Profile日志信息,并为BeanFactory中的部分属性赋值。
12、刷新容器,在该方法中集成了Tomcat容器
13、加载SpringMVC.
14、刷新后的方法,空方法,给用户自定义重写afterRefresh()
15、Duration timeTakenToStartup = Duration.ofNanos(System.nanoTime() - startTime)算出启动花费的时间。
16、打印日志Started xxx in xxx seconds (JVM running for xxxx)
17、listeners.started(context, timeTakenToStartup)触发ApplicationStartedEvent事件监听。上下文已刷新,应用程序已启动。
18、调用ApplicationRunner和CommandLineRunner
19、返回上下文。

参考

一文搞懂SpringBoot启动流程及自动配置
SpringBoot启动流程详细介绍
SpringBootApplication详解(Spring Boot启动原理)

给个三连吧 谢谢谢谢谢谢了
在这里插入图片描述

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

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

相关文章

随手笔记(四十六)——idea source root错乱

一般问题会出现在这里,写着别的项目的项目名,就是因为reload了别的项目的maven文件,借鉴了很多网上的说法,比如改project Structure里面改子项目的source。确实讲得挺好,就是不会用;所以最后的解决方案就是…

多云系列|10个关键的多云战略:简介

随着VMware继续向客户介绍多云问题以及VMware跨云服务在云智能计算历程中的优势,有一个问题经常被提及,“我如何开始?”。本博客系列旨在为客户提供指导,并回顾多云的十大领域,介绍我们应该关注哪些方面。此外&#xf…

引领UI设计生产工具进入AI时代,猿辅导旗下Motiff发布三大AI功能

近期,IXDC 2023国际体验设计大会在北京国家会议中心举行,共邀请全球800企业,1000名设计师共襄主题为“设计领导力”的创新盛会。作为全球最具影响力的创新设计大会之一,大会围绕创新、系统、商业三个关键维度,结合在AI…

MySQL优化第二篇

MySQL优化第二篇 性能分析小表驱动大表慢查询日志日志分析工具mysqldumpslow Show Profile进行SQL分析(重中之重) 七种JOIN 1、inner join :可以简写为join,表示的是交集,也就是两张表的共同数据 sql语句&#xff1a…

Recognize Anything:一个强大的图像标记模型

Recognize Anything是一种新的图像标记基础模型,与传统模型不同,它不依赖于手动注释进行训练;相反,它利用大规模的图像-文本对。RAM的开发过程包括四个关键阶段: 通过自动文本语义解析获得大规模的无标注图像标签。结合标题和标注任务&#…

网络电视盒子哪个品牌好?测评工作室深入分析电视盒子排名

电视盒子只需要联网就可以收看海量资源,不需要每月缴费,玩游戏、上网课、K歌都不在话下,对新手来说电视盒子如何选择?网络电视盒子哪个品牌好?工作室购入了最热销的15款电视盒子经过多角度对比后整理了电视盒子排名&am…

Linux内核源码分析 (B.x)Linux页表的映射

Linux内核源码分析 (B.x)Linux页表的映射 文章目录 Linux内核源码分析 (B.x)Linux页表的映射一、ARM32页表1、页表术语2、虚拟地址到物理地址转换3、一级页表项4、二级页表项 二、ARM64页表1、ARMv8-A架构2、4KB大小页4级映射 三、Linux内核中关于页表的函数和宏1、查询页表2、…

第三方ipad笔哪个牌子好用?开学季比较好用的电容笔

新学期有什么电容笔值得入手?这款平替电容笔,名为Apple Pencil,唯一的区别就是它的压力感应功能,同时拥有重力压感以及倾斜压感,而平替电容笔仅只拥有倾斜压感一种功能,不过它的压力感应能力很强&#xff0…

034:vue项目利用qrcodejs2生成二维码示例

第034个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…

无涯教程-JavaScript - IF函数

描述 如果条件为TRUE,则IF函数返回一个值,如果条件为FALSE,则返回另一个值。 语法 IF (logical_test, value_if_true, [value_if_false]) 争论 Argument描述Required/Optionallogical_testThe condition you want to test.Requiredvalue_if_trueThe value that you want re…

藿香正气水泡脚火了!谁都可以“插一脚”吗?

白露身不露,寒露脚不露 眼见着凉凉秋意脚步将至 不少人又把泡脚养生提上了日程 不过,用藿香正气水泡脚你有尝试过吗? 有人说泡完能祛湿 可有人居然腹泻了这是怎么回事? 👇👇👇 藿香正气水…

足不出户游登封,千里之外访嵩山

阿里元境联合河南登封文旅打造首个虚实结合的文旅元宇宙 虚实结合元宇宙成效明显 说到河南嵩山,很多人会想到“五岳”。作为五岳之一,嵩山历史悠久,历史人文景观众多。徐霞客曾评价:“嵩山天下奥,少室险奇特。不游三皇…

【css】能被4整除 css :class,判断一个数能否被另外一个数整除,余数

判断一个数能否被另外一个数整除 一个数能被4整除的表达式可以表示为:num%40,其中,num为待判断的数,% 为取模运算符,为等于运算符。这个表达式的意思是,如果num除以4的余数为0,则返回true&…

uniapp——生成一个签字板

在开发项目中有签名/签字的需求&#xff0c;以下实现&#xff1a; <template><view class"new_file" v-if"showAutograph"><view class"popupBox"><view class"popupTopBox">签字板</view><canvas c…

SpringBoot-Actuator

SpringBoot-Actuator 1 综合 Spring Boot Actuator 模块 详解&#xff1a;健康检查&#xff0c;度量&#xff0c;指标收集和监Spring boot——Actuator 详解Spring Boot Actuator官网 - 最新Spring Boot Actuator官网-2.3.x关于spring-boot-actuator的httptrace端点不生效问题…

焊接符号学习

欧美焊接符号举例 4.5------表示焊点直径 【3】------根据图示说明&#xff0c;表示此项为CC项或者SC项 6-------表示此处为第六CC项或者SC项 BETWEEN①AND②------表示①件和②件俩点之间的焊点 12X------表示俩点之间的焊点个数为12个 日本焊接符号举例 A------根据图示&…

IO和进程day08(消息队列、共享内存、信号灯集)

今日任务 1.代码 inversion.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/types.h> #include …

革命性创新:RFID技术引领汽车零部件加工新时代

革命性创新&#xff1a;RFID技术引领汽车零部件加工新时代 RFID&#xff08;Radio Frequency Identification&#xff0c;射频识别&#xff09;技术是一种利用无线电频率进行自动识别的技术&#xff0c;可以快速、准确地识别物体并获取相关数据。在汽车零部件加工中&#xff0…

科普AI技术中API不可缺的理由

API是什么 API是应用程序接口&#xff0c;是一些预先定义的函数&#xff0c;或指软件系统不同组成部分衔接的约定。 API目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力&#xff0c;而又无需访问原码或理解内部工作机制的细节。API的一个主要功能是提供…

RDPV5P-10/350-EB、RBP10P-10/50Y-EB电控比例溢流阀放大器

RDPV5P-10/50-EC、RDPV5P-10/100-EB、RDPV5P-10/150-EC、RDPV5P-10/250-EB、RDPV5P-10/315-EC、RDPV5P-10/350-EB电液比例直动式溢流阀 RBP10P-10/50Y-EB、RBP20P-10/100Y-EC、RBP30P-10/150Y-EB、RBP35P-10/250Y-EC、RBP20P-10/315Y-EB、RBP10P-10/350Y-EC电液比例柱塞平衡式溢…