spring-boot 启动流程

news/2025/2/6 9:52:19/

一、spring-boot启动流程都做了哪些事?

  1. 加载配置文件
  2. 加载日志组件
  3. 创建spring容器,扫描bean并注入容器
  4. 启动tomcat

二、每件事是如何完成的

  1. 加载配置文件,通过ConfigFileApplicationListener对象加载,调用流程如下
调用
构造函数中调用
调用
调用
调用
调用
调用
调用
SpringApplication.run()
application=new SpringApplication()
setListeners(getSpringFactoriesInstances(ApplicationListener.class))
从spring-boot-*.jar中读取/META-INF/spring.factories文件
加载ConfigFileApplicationListener类
application.run()
SpringApplicationRunListeners listeners = getRunListeners(args)
从spring-boot-*.jar中读取/META-INF/spring.factories文件
加载EventPublishingRunListener类
prepareEnvironment()
listeners.environmentPrepared()
EventPublishingRunListener.environmentPrepared()
ConfigFileApplicationListener.onApplicationEvent()
onApplicationEnvironmentPreparedEvent()
postProcessEnvironment()
读取配置文件
  1. 加载日志组件,通过LoggingApplicationListener对象决定并加载日志组件
调用
构造函数中调用
调用
调用
调用
调用
调用
调用
SpringApplication.run()
application=new SpringApplication()
setListeners(getSpringFactoriesInstances(ApplicationListener.class))
从spring-boot-*.jar中读取/META-INF/spring.factories文件
加载LoggingApplicationListener类
application.run()
SpringApplicationRunListeners listeners = getRunListeners(args)
从spring-boot-*.jar中读取/META-INF/spring.factories文件
加载EventPublishingRunListener类
listeners.starting()
EventPublishingRunListener.starting()
LoggingApplicationListener.onApplicationEvent()
onApplicationStartingEvent()
LoggingSystem.get()
决定并加载日志组件
  1. 创建spring容器,扫描bean并注入容器。
    • spring-boot 扫描bean依靠ConfigurationClassPostProcessor对象,该对象处理spring-boot的相关注解,扫描并注入bean
    • spring-boot 通过spring-boot-autoconfigure-*.jar/META-INF/spring.factories加载一些常用的框架,如 spring-web-mvc,数据源,aop,事务,redis等
调用
调用
加载
构造方法中调用
构造方法中调用
向容器中添加
调用
调用
调用
调用
调用
SpringApplication.run()
application=new SpringApplication()
application.run()
createApplicationContext()
context=new AnnotationConfigServletWebServerApplicationContext()
new AnnotatedBeanDefinitionReader()
AnnotationConfigUtils.registerAnnotationConfigProcessors()
ConfigurationClassPostProcessor
refreshContext()
context.refresh()
invokeBeanFactoryPostProcessors()
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors
invokeBeanDefinitionRegistryPostProcessors()
ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry()
处理spring-boot的相关注解,扫描并注入bean
  1. 启动tomcat
调用
调用
加载
调用
调用
调用
调用
SpringApplication.run()
application=new SpringApplication()
application.run()
createApplicationContext()
context=new AnnotationConfigServletWebServerApplicationContext()
refreshContext()
context.refresh()
onRefresh()
createWebServer()创建tomcat
getSelfInitializer()
1. 从容器中获ServletContextInitializer实现对象;
2. 从容器中获取Filter,Servlet,然后被封装为ServletContextInitializer实现对象。
3. 在tomcat创建ServletContext时会调用上述获取的ServletContextInitializer
finishRefresh()启动tomcat

http://www.ppmy.cn/news/63056.html

相关文章

SeaweedFS学习笔记:TTL 配置数据存活时间

文章目录 1. 介绍2. 如何使用3. TTL格式4. TTL实现细节5. 部署建议 1. 介绍 SeaweedFS本质是key-file存储,文件可以通过TTL配置过期时间。 2. 如何使用 假设有一个文件需要保留3分钟。 首先,请求Master服务分配一个TTL为3分钟的file id。 curl http:…

全开放式时代来临,南卡OE带给你非同寻常的舒适和听觉感受

NANK南卡一直致力于深耕音频领域,不断创新,将于五月份发布全新形态的全开放式蓝牙耳机。相较于传统耳机,开放式蓝牙耳机除了佩戴零感舒适,还能在沉浸音乐的同时与外界保持沟通。南卡OE作为新推出的开放式蓝牙耳机,采用…

(二)用Qt实现登录界面——打造简洁、美观的登录体验

文章目录 一、引言1、什么是Qt框架,其主要特点是什么?2、Qt框架的应用范围,如何在不同的平台上开发应用程序?3、Qt框架的优点和劣势,与其他框架的比较。 二、相关技术1、socket编程 三、Qt框架的使用1、Qt框架的基本概…

生成随机数

用于产生随机数 boolean nextBoolean(): 返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 boolean 值。 void nextBytes(byte[] bytes): 生成随机字节并将其置于用户提供的 byte 数组中。 double nextDouble(): 返回下一个伪随机数,它是取…

Linux中与“内核模块”相关的数据结构

【摘要】本文详细解释了linux中与模块相关的内核数据结构,便于大家在学习理解内核源码或驱动编程中理解相应代码和思想。 三、内核模块相关的数据结构 目录 THIS_MODULE宏module结构体module_use 3.1 THIS_MODULE宏 和CURRENT宏有几分相似,可以通过T…

【逐函数详细讲解ORB_SLAM2算法和C++代码|KeyFrameDatabase|1-11】

在ORB_SLAM2算法中,KeyFrameDatabase类是一个关键帧数据库的实现,用于存储和检索与关键帧相关的信息。关键帧数据库在SLAM中的主要用途是提供循环检测(Loop Detection)和重定位(Relocalization)功能。 循环…

OpenPCDet框架解析文章导航

注意:本文章没有任何实质内容,主要是为OpenPCDet框架解析进行相应的文章导航,内容全部见《点云检测OpenPCDet专栏》 最近基于OpenPCDet来对PointPillars算法做一些实验,打算用一个完整的专栏来记录整个OpenPCDet的整体框架以及各个模块之间的结构。耗时一个多月,耗费精力较…

欧拉函数详解

欧拉函数 定义 在[1,n]的范围内所有与n互质的数字的个数。 我们用 φ ( n ) \varphi(n) φ(n)来表示数字n的欧拉函数的值,例如: φ ( 4 ) 2 \varphi(4)2 φ(4)2,与在[1,4]中与4互质的数字是:1 3,有两个&#xff0c…