Spring 全家桶之 Spring Boot 2.6.4(九)- 启动流程解析(一)

简介: Spring 全家桶之 Spring Boot 2.6.4(九)- 启动流程解析

一、Debug Spring Boot 启动流程

创建工程spring-boot-fundamental,只添加基本依赖

a4975dc3c0774707b1335c9bd157412c_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

Debug启动流程,在SpringApplication.run(AppApplication.class, args)这一行打上断点

3a99a957e7e74c7a827f4d3ce440d884_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

创建SpringApplication对象

首先会创建SpringApplication对象

image.png

调用包含有ResourceLoader和Class<?>... 两个参数的构造函数创建对象

Assert.notNull(primarySources, "PrimarySources must not be null");
this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
复制代码

primarySources包含了主配置类,这句代码是判断传入的primarySources是否为空,如果主配置类存在就一定不为空,并将这些Class存储到LinkedHashSet集合中

this.webApplicationType = WebApplicationType.deduceFromClasspath();
复制代码

判断当前应用是不是Web应用

image.png

debug到这个方法中去

image.png

判断当前应用是一个Web应用

this.bootstrapRegistryInitializers = new ArrayList<>(
      getSpringFactoriesInstances(BootstrapRegistryInitializer.class));
复制代码

image.png

image.png

就是从spring.factories配置文件中获取所有的自动配置类

getSpringFactoriesInstances方法就是从配置文件中获取指定的配置类,根据传入的类型

this.bootstrapRegistryInitializers = new ArrayList<>(
      getSpringFactoriesInstances(BootstrapRegistryInitializer.class));
复制代码

这句代码就是获取所有的BootstrapRegistryInitializer配置类,将其实例化并放入一个ArrayList中,赋值给bootstrapRegistryInitializers属性

setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
复制代码

这句代码就是设置initializers属性,通过getSpringFactoriesInstance获取配置文件中所有的ApplicationContextInitializer并实例化放入集合中作为initializers属性的值

image.png

Debug可以看到放置了这8个initializer到集合中

setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
复制代码

setListeners也是通过调用getSpringFactoriesInstance获取配置文件中所有的ApplicationListener类并实例化放入listeners属性的集合中 debug查看放入多少个listener

image.png

deduceMainApplicationClass()方法是决定哪个程序是主程序

image.png

再往下进行debug

image.png

确定了主程序

到此,整个SpringApplication对象创建完成了

创建SpringApplication大概有这几步:

  1. 保存主配置类
  2. 判断是否为Web应用
  3. 从类路径下找到META-INF/spring.factorues配置所有的ApplicationContextInitializer,然后保存起来


相关文章
|
2天前
|
缓存 前端开发 Java
【框架】Spring 框架重点解析
【框架】Spring 框架重点解析
17 0
|
2天前
|
XML 安全 前端开发
Spring Security 重点解析(下)
Spring Security 重点解析
12 1
|
2天前
|
安全 NoSQL Java
Spring Security 重点解析(上)
Spring Security 重点解析
11 1
|
2天前
|
前端开发 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口
【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口
24 0
|
2天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口(下)
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口
10 0
|
2天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口(上)
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口
15 0
|
2天前
|
算法 Linux 调度
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
14 1
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
|
2天前
|
Linux 调度 数据库
|
2天前
|
Linux API 调度
xenomai内核解析-xenomai实时线程创建流程
本文介绍了linux硬实时操作系统xenomai pthread_creta()接口的底层实现原理,解释了如何在双内核间创建和调度一个xenomai任务。本文是基于源代码的分析,提供了详细的流程和注释,同时给出了结论部分,方便读者快速了解核心内容。
20 0
xenomai内核解析-xenomai实时线程创建流程
|
2天前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
57 0

推荐镜像

更多