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,然后保存起来


相关文章
|
8天前
|
XML 安全 前端开发
Spring Security 重点解析(下)
Spring Security 重点解析
22 1
|
8天前
|
缓存 前端开发 Java
【框架】Spring 框架重点解析
【框架】Spring 框架重点解析
24 0
|
8天前
|
安全 NoSQL Java
Spring Security 重点解析(上)
Spring Security 重点解析
23 1
|
8天前
|
算法 Linux 调度
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
75 1
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
|
8天前
|
Linux 调度 数据库
|
8天前
|
Linux API 调度
xenomai内核解析-xenomai实时线程创建流程
本文介绍了linux硬实时操作系统xenomai pthread_creta()接口的底层实现原理,解释了如何在双内核间创建和调度一个xenomai任务。本文是基于源代码的分析,提供了详细的流程和注释,同时给出了结论部分,方便读者快速了解核心内容。
40 0
xenomai内核解析-xenomai实时线程创建流程
|
8天前
|
Java Spring 容器
深入理解Spring Boot启动流程及其实战应用
【5月更文挑战第9天】本文详细解析了Spring Boot启动流程的概念和关键步骤,并结合实战示例,展示了如何在实际开发中运用这些知识。
24 2
|
6天前
|
Linux 网络安全 Windows
网络安全笔记-day8,DHCP部署_dhcp搭建部署,源码解析
网络安全笔记-day8,DHCP部署_dhcp搭建部署,源码解析
|
7天前
HuggingFace Tranformers 源码解析(4)
HuggingFace Tranformers 源码解析
7 0
|
7天前
HuggingFace Tranformers 源码解析(3)
HuggingFace Tranformers 源码解析
8 0

推荐镜像

更多