【日积月累】SpringBoot启动流程

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

目录

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.hqwc.cn/news/109164.html

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

相关文章

自动驾驶多任务框架Hybridnets——同时处理车辆检测、可驾驶区域分割、车道线分割模型部署(C++/Python)

一、多感知任务 在移动机器人的感知系统,包括自动驾驶汽车和无人机,会使用多种传感器来获取关键信息,从而实现对环境的感知和物体检测。这些传感器包括相机、激光雷达、雷达、惯性测量单元(IMU)、全球导航卫星系统&am…

Java经典问题解答(9题)

文章目录 1、通关jwt靶场的其中任意两关(该题与Java无关)启动环境第4关第5关第7关 2、java是如何跨平台通信的3、java为什么需要类名和文件名一致4、main函数的作用是什么5、.class文件和.java是什么关系6、java在编写函数的时候void是什么意思7、java声…

IAM、EIAM、CIAM、RAM、IDaaS 都是什么?

后端程序员在做 ToB 产品或者后台系统时,都不可避免的会遇到账号系统、登录系统、权限系统、日志系统等这些核心功能。这些功能一般都是以 SSO 系统、RBAC 权限管理系统等方式命名,但这些系统合起来有一个专有名词:IAM。 IAM IAM 是 Identi…

Linux UDP编程流程

文章目录 UDP编程流程UDP协议无连接的特点UDP协议数据报的特点 UDP编程流程 UDP 提供的是无连接、不可靠的、数据报服务。服务器端和客户端没有什么本质上的区别。编程流程如下: socket()用来创建套接字,使用 udp 协议时,选择数据报服务 SOC…

小白如何选择阿里云服务器配置?CPU内存带宽系统盘选择

阿里云服务器配置选择_CPU内存/带宽/存储配置_小白指南,阿里云服务器配置选择方法包括云服务器类型、CPU内存、操作系统、公网带宽、系统盘存储、网络带宽选择、安全配置、监控等,阿小云分享阿里云服务器配置选择方法,选择适合自己的云服务器…

PCL 约束Delaunay三角网(C++详细过程版)

目录 一、算法原理二、代码实现三、结果展示1、原始点云2、普通Delaunay3、约束Delaunay本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 首先提取边界点,然后根据边界点构建约束,最后在约束边界内构建Del…

flink 写入数据到 kafka 后,数据过一段时间自动删除

版本 flink 1.16.0kafka 2.3 流程描述: flink利用KafkaSource,读取kafka的数据,然后经过一系列的处理,通过KafkaSink,采用 EXACTLY_ONCE 的模式,将处理后的数据再写入到新的topic中。 问题描述&#xff1…

学习jQuery库的第一天

简介 什么是 jQuery ? jQuery 是一个广泛使用的 JavaScript 库。它简化了网页开发中常见的许多任务,例如 HTML 文档遍历、操作 HTML 元素、处理事件、动画效果、Ajax 网络请求等。通过使用 jQuery,开发人员可以更加高效地编写跨浏览器兼容的…

竞赛 基于机器视觉的火车票识别系统

文章目录 0 前言1 课题意义课题难点: 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于机器视觉的火车票识别系统 该项目较为新颖,适合作为竞赛…

C++模版基础

代码地址 gitgithub.com:CHENLitterWhite/CPPWheel.git 专栏介绍 本专栏会持续更新关于STL中的一些概念,会先带大家补充一些基本的概念,再慢慢去阅读STL源码中的需要用到的一些思想,有了一些基础之后,再手写一些STL代码。 (如果你…

RabbitMQ常见问题

一、RabbitMQ如何保证消息不丢失? 这是面试时最喜欢问的问题,其实这是个所有MQ的一个共性的问题,大致的解 决思路也是差不多的,但是针对不同的MQ产品会有不同的解决方案。而RabbitMQ 设计之处就是针对企业内部系统之间进行调用设…

视频监控系统/安防监控/视频AI智能分析:小动物识别算法场景汇总

随着人们对生态环境的关注日益提升,大家对动物保护意识也逐渐增强。旭帆科技智能分析网关小动物识别算法应运而生。除了对保护动物的识别以外,旭帆科技AI智能分析网关还可以识别常见的老鼠等动物,助力明厨亮灶监管,保卫食品安全。…