SpringBoot源码分析:SpringBoot启动源码(一)

news2024/12/25 23:50:47

一、概述

SpringBoot启动的源码分为前期初始化,和后期启动两个部分,我们从这两个部分开始介绍。

二、前期初始化

SpringBoot前期初始化主要由下面三行代码组成。

 进入SpringApplication.getSpringFactoriesInstances方法

 最终进入SpringFactoriesLoader.loadFactoryNames方法

 最后SpringFactoriesLoader.loadSpringFactories会到spring.factories文件下加载对应的配置类。

 设置监听器的流程和设置初始化器的代码实现差不多,这里边不再缀述了。

三、后期启动

后期启动主要分为八步,我将一一介绍。

(一)、 获取、启动运行过程监听器

这两段代码获取,并启动了监听器,重点在于启动监听器,我们继续往下看。

 EventPublishingRunListener.starting方法利用多播器,将事件广播出去,这就是监听启动做的事情。

(二)、 环境构建

这一步主要用于加载系统配置以及用户的自定义配置(application.properties),源码解释如下

(三)、创建IOC容器

createApplicationContext创建了IOC容器。

(四)、创建IOC容器

在刷新容器之前做准备,其中有一个非常关键的操作:将启动类注入容器,为后续的自动化配置奠定基础。源码如下:

prepareContext()源码解析如下图,内容还是挺多的:

 

从上图可以看出步骤很多,下面将会详细介绍几个重点的内容。

1、调用初始化器

SpringApplication构建过程中设置的初始化器,从spring.factories取值的。执行的流程很简单,遍历执行,源码如下图:

2、加载启动类,注入容器

这一步是将主启动类加载到IOC容器中,作为后续自动配置的入口。

SpringApplication构建过程中将主启动类放置在primarySources这个集合中,此时的getAllSources()即是从其中取值,如下图:

这里取出的就是主启动类,当然你的项目中可能不止一个,接下来就是将其加载到IOC容器中了,源码如下:

 

经过SpringApplication.load---->>BeanDefinitionLoader.load---->>AnnotatedBeanDefinitionReader

.doRegisterBean---->>BeanDefinitionReaderUtils.registerBeanDefinition---->>DefaultListableBeanFactory.registerBeanDefinition

 

(五)、刷新容器

刷新容器完全是Spring的功能了,比如初始化资源,初始化上下文广播器等,这个就不再详细介绍,有兴趣可以看看Spring的源码。

(六)、 IOC容器的后置处理

一个扩展方法,源码如下,默认为空,如果有自定义需求可以重写,比如打印一些启动结束日志等。

 

(七)发出结束执行的事件

同样是EventPublishingRunListener这个监听器,广播ApplicationStartedEvent事件。

(八)执行Runners

Spring Boot 提供了两种Runner让我们定制一些额外的操作,分别是CommandLineRunnerApplicationRunner,调用的源码如下:

 Spring Boot 启动流程相对简单些,作者将其细分了以上八个步骤,希望能够帮助读者理解,流程图如下:

参考文章:

springboot启动流程源码解析(带流程图)_springboot框架流程图_wuweixianzheng的博客-CSDN博客

Spring Boot 启动流程源码如何分析? - 知乎

 GitHub - chenjiabing666/JavaFamily: 【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/600151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自学黑客(网络安全)入门小测试

「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 最近突然出现好多自学黑客(网络安全)的文章,粉丝看到后…

chatgpt赋能python:Python关键词统计

Python关键词统计 Python是一种高级编程语言,为开发人员提供了许多功能和库。对于SEO来说,Python具有统计网站上的关键词和分析数据的重要功能。在本文中,我们将探讨Python关键词统计和如何在SEO中使用它。 什么是Python关键词统计 Python…

一图看懂 configparser 模块:配置文件解析器,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 configparser 模块:配置文件解析器,资料整理笔记(大全) 🧊摘要🧊模块图🧊类关系图&#…

vue的虚拟DOM

vue的虚拟DOM 什么是虚拟DOM 虚拟DOM提供了一个与平台无关的抽象层,将应用程序的界面表示抽象为一个虚拟的DOM树。这意味着开发人员可以使用相同的代码和逻辑来描述应用程序的用户界面,而不需要关心具体的平台实现细节。虚拟DOM允许开发人员使用一种统…

HashedWheelTimer详解

1、 前言 你好呀,我是歪歪。 今天我带大家来卷一下时间轮吧,这个玩意其实还是挺实用的。 常见于各种框架之中,偶现于面试环节,理解起来稍微有点难度,但是知道原理之后也就觉得: 大多数人谈到时间轮的时候都…

chatgpt赋能python:Python关键词用法介绍

Python关键词用法介绍 Python是一种高级编程语言,具有简洁易懂、易于学习等特点。作为一位10年的Python工程师,我发现掌握Python的关键词用法对于编程非常重要。因此,本文将重点介绍Python关键词的用法,并为您提供相关的代码示例…

iOS加固保护新思路

之前有写过【如何给iOS APP加固】,但是经过一段时间的思考,我找到了更具有实践性的代码,具体可以看下面。 技术简介 iOS加固保护是基于虚机源码保护技术,针对iOS平台推出的下一代加固产品。可以对iOS APP中的可执行文件进行深度…

小程序 自建本地数据库 本地存储

大家好哇,我是梦辛工作室的灵,在最近的开发过程中又遇到了一些问题,这次是关于本地存储的,在小程序面进行存储一些数据,本来就依靠小程序的本地储存API 就可以实现,但数据量小还好,如果数据量大…

chatgpt赋能python:Python开发:为什么适合SEO

Python开发:为什么适合SEO 在当今互联网上,搜索引擎优化(SEO)尤为重要。因为通过优化您的网站,在搜索引擎上排名更高可以增加您的网站流量和业务转化率。在这篇文章中,我们将探讨为什么Python是一个优秀的…

SpringMVC重点知识

目录 第一章 SpringMVC概念 0.引言 1.MVC 2.SpringMVC 3.SpringMVC的特点 4.JavaSE、JavaEE、javaME的区别 第二章 Spring MVC的使用 1.SpringMVC的配置 2.web.xml配置 3. 创建当前的请求控制器 4. 创建SpringMVC的配置文件 5.实现对首页index.xml的访问 6.Reques…

总结886

学习目标: 月目标:6月(张宇强化10讲,专业课,背诵15篇短文,考研核心词过三遍) 周目标:1800线性代数部分并完成错题记录,英语背3篇文章并回诵,检测&#xff0…

Throwable源码

介绍 Throwable类是Java语言中所有错误(errors)和异常(exceptions)的父类,直接子类为 Error 和 Exception。只有继承于Throwable的类或子类才能被抛出,还有一种是Java中的throw注解类也可以抛出。 public…

Stub实验

需求 将区域12设置为Stub区域,使区域12的路由设备不受外部链路影响(不接收4/5类LSA)降低区域12(末梢区域)设备压力,还能让区域12的PC1与外部PC3通信 配置步骤 1)配置接口信息 - 配置PC的IP地址 - 配置路由…

chatgpt赋能python:Python免费资料全揭秘:入门学习到深入应用

Python免费资料全揭秘:入门学习到深入应用 作为一种最具代表性的动态编程语言,Python在很多领域得到了广泛的应用,因其简单易学、开发效率快等特点而备受开发者的喜爱。如果你刚开始学习Python或是想提高你的Python编程技能,那么…

系统移植-环境搭建

安装系统 在基于ARM处理器的开发板上安装Linux系统 1.移植的目的 不同架构的处理器指令集不兼容,即便是相同的处理器架构,板卡不同驱动代码也不兼容 ; Linux是一个通用的内核并不是为某一个特定的处理器架构或板卡设计的,…

【生物力学】《人体骨肌系统生物力学》- 王成焘老师 - 第3章 - 人体运动测量与仿真分析

第2章回到目录后续暂时用不到 文章目录 3.1 概论1. 基于影像的运动捕捉技术2 . 其他运动捕捉技术 3.2 人体运动测量内容与设备3.2.1 人体运动测量内容1. 时间参数2. 空间参数3. 时空参数 3.2.2 运动捕捉系统的主要类型与工作特性1. 运动捕捉系统组成2. 运动捕捉系统主要类型与工…

chatgpt赋能python:用Python做股票分析

用Python做股票分析 在当今的股市中,数据分析和预测已经变得十分重要。Python作为最流行的编程语言之一,不仅易于学习,还有非常强大的数据处理和分析能力。在本文中,我们将探讨如何用Python进行股票分析。 数据收集 要进行股票…

Java网络开发(Tomcat)——遇到的 bug 汇总(持续更新):bug:

目录 引出:bug::bug::bug:Tomcat开发的bug汇总session不能转换成String类型在servlet的if处理流程中,没有加return后端传给jsp的数据,前端jsp不显示jsp的包没有导,用foreach方法的时候报错jsp的forEach方法报错jsp用foreach的时候&#xff0c…

chatgpt赋能python:Python免费软件:提高工作效率的首选

Python免费软件:提高工作效率的首选 Python作为一种易于上手的编程语言,在业界广为流传。而随着Python的发展,也催生了相应的一些免费软件,这些软件能够让用户更好地利用Python编程语言,提高工作效率,创造…

数据存储云安全的 5 大支柱

与任何数据存储系统一样,云也存在相当多的安全风险。领导者不应争论云本身安全或不安全的方式,而应质疑他们是否安全地使用云。 虽然云安全采用组织和云提供商之间的责任共担模式,但归根结底,云环境面临的最大风险是解决方案的错…