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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Spring 全家桶之 Spring Boot 2.6.4(九)- 启动流程解析

执行run()方法

在SpringApplication对象创建完成之后,开始执行run()方法;重新启动Debug,进入run方法

0000ffeb26764578aaac560f1f4e936e_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

此时SpringApplication对象已经创建好,run方法中的流程就是Spring Boot启动的流程。

Step Over第一句289行代码只是为了标记一个起始时间

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

这里是将创建SpringApplication对象时从配置文件中获取所有的BootstrapRegistryInitializer配置类,这里将列表遍历,但是列表为空,返回一个默认的DefaultBootstrapContext

第291行声明了一个容器,接下来所有的代码就是往这个容器中注册组件,最终返回这个容器

context容器中注入了哪些组件? 292行配置headless属性为True,与awt应用相关

SpringApplicationRunListeners listeners = getRunListeners(args);
复制代码

Step Into 进入到 getRunListeners方法

926abfaf343d462ca262f36c4b2e6996_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

这里又调用了getSpringFactoriesInstances方法,这个方法的作用就是从类路径下的spring.factoies中获取指定的类,这里要获取的是所有的SpringApplicationRunListener类

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

这里获取了一个EventPublishRunListener

继续Step Over到294行

listeners.starting(bootstrapContext, this.mainApplicationClass);
复制代码

这里调用了starting方法,参数为默认的boostrapContext和SpringAppication中的主程序既AppApplication,进入starting方法

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

这里是循环启动这些监听器

在296行上打断点,重启启动debug模式;Step Over进入到prepareEnvironment方法中,也就是准备环境

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

该方法中先是创建了一个environment,创建环境之后回调listeners,表示环境准备完成

第299行是打印banner也就是启动应用时控制台出现的Spring图标,这个图标是可以自定义的

589d5647f40b4655b301cf168ef217e9_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

Step Into 进入 300行的createApplicationContext方法

7668007ad2094ff68006030a1f974f5c_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

再次step into进入到create方法

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

这里根据WebApplication是Servlet类型返回了AnnotationConfigServletWebServerApplicationContext容器

第301行给容器设置启动属性,设置了一个DefaultApplicationStartup

8c59d6617971492baad4af2442a797c6_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

下一行第302行的作用是准备上下文环境,进入到该方法中;这个方法中对容器做了写配置

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

set环境,注册一些后置处理器,进入applyInitializers方法中

297bdd812efd4759922f0b2a328e1d8a_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

这个方法就是遍历SpringApplication中initializers中所有的initializer,然后调用initialize方法;遍历完成之后来到第382行

09cf8681a90c47b9a48f7b5bdbdfa286_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

进入到contextPrepared方法中

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

这里就是回调所有的listener的contextPrepared方法

回到prepareContext方法,step over到第389行

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

这里就是注册命令行参数,并且将banner也注册进来;Step Over到第398行

9aa1f0d7acff4b6d8164d82fce8ab3b6_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

这里做了判断,然后对容器进行了set操作;来到第406行

3258ea181b3f4a61ab6560b70bd962bd_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

这里获取主程序类,然后判断是否为空


相关文章
|
11天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
39 2
|
29天前
|
搜索推荐 Java Spring
Spring Filter深度解析
【10月更文挑战第21天】Spring Filter 是 Spring 框架中非常重要的一部分,它为请求处理提供了灵活的控制和扩展机制。通过合理配置和使用 Filter,可以实现各种个性化的功能,提升应用的安全性、可靠性和性能。还可以结合具体的代码示例和实际应用案例,进一步深入探讨 Spring Filter 的具体应用和优化技巧,使对它的理解更加全面和深入。
|
1月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
68 2
|
1月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
109 1
|
1月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
71 0
|
1月前
|
敏捷开发 数据可视化 测试技术
解析软件项目管理:以板栗看板为例,其如何有效影响并优化软件开发流程
软件项目管理是一个复杂而重要的过程,涵盖了软件产品的创建、维护和优化。其核心目标是确保软件项目能够顺利完成,同时满足预定的质量、时间和预算目标。本文将深入探讨软件项目管理的内涵及其对软件开发过程的影响,并介绍一些有效的管理工具。
|
1月前
|
Java Spring
springboot 学习十一:Spring Boot 优雅的集成 Lombok
这篇文章是关于如何在Spring Boot项目中集成Lombok,以简化JavaBean的编写,避免冗余代码,并提供了相关的配置步骤和常用注解的介绍。
105 0
|
6月前
|
XML 安全 Java
深入实践springboot实战 蓄势待发 我不是雷锋 我是知识搬运工
springboot,说白了就是一个集合了功能的大类库,包括springMVC,spring,spring data,spring security等等,并且提供了很多和可以和其他常用框架,插件完美整合的接口(只能说是一些常用框架,基本在github上能排上名次的都有完美整合,但如果是自己写的一个框架就无法实现快速整合)。
|
3月前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
|
6月前
|
Java 数据安全/隐私保护
Neo4j【付诸实践 01】SpringBoot集成报错org.neo4j.driver.exceptions.ClientException:服务器不支持此驱动程序支持的任何协议版本(解决+源代码)
Neo4j【付诸实践 01】SpringBoot集成报错org.neo4j.driver.exceptions.ClientException:服务器不支持此驱动程序支持的任何协议版本(解决+源代码)
337 1
下一篇
无影云桌面