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

一、概述

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

二、前期初始化

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

SpringBoot源码分析:SpringBoot启动源码(一)_第1张图片

 进入SpringApplication.getSpringFactoriesInstances方法SpringBoot源码分析:SpringBoot启动源码(一)_第2张图片

 最终进入SpringFactoriesLoader.loadFactoryNames方法

SpringBoot源码分析:SpringBoot启动源码(一)_第3张图片

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

SpringBoot源码分析:SpringBoot启动源码(一)_第4张图片

SpringBoot源码分析:SpringBoot启动源码(一)_第5张图片

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

SpringBoot源码分析:SpringBoot启动源码(一)_第6张图片

三、后期启动

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

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

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

SpringBoot源码分析:SpringBoot启动源码(一)_第7张图片

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

SpringBoot源码分析:SpringBoot启动源码(一)_第8张图片

(二)、 环境构建

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

SpringBoot源码分析:SpringBoot启动源码(一)_第9张图片

(三)、创建IOC容器

createApplicationContext创建了IOC容器。

SpringBoot源码分析:SpringBoot启动源码(一)_第10张图片

SpringBoot源码分析:SpringBoot启动源码(一)_第11张图片

(四)、创建IOC容器

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

SpringBoot源码分析:SpringBoot启动源码(一)_第12张图片

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

SpringBoot源码分析:SpringBoot启动源码(一)_第13张图片

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

1、调用初始化器

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

SpringBoot源码分析:SpringBoot启动源码(一)_第14张图片

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

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

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

SpringBoot源码分析:SpringBoot启动源码(一)_第15张图片

这里取出的就是主启动类,当然你的项目中可能不止一个,接下来就是将其加载到IOC容器中了,源码如下:SpringBoot源码分析:SpringBoot启动源码(一)_第16张图片

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

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

SpringBoot源码分析:SpringBoot启动源码(一)_第17张图片

SpringBoot源码分析:SpringBoot启动源码(一)_第18张图片

SpringBoot源码分析:SpringBoot启动源码(一)_第19张图片

SpringBoot源码分析:SpringBoot启动源码(一)_第20张图片

SpringBoot源码分析:SpringBoot启动源码(一)_第21张图片

SpringBoot源码分析:SpringBoot启动源码(一)_第22张图片

(五)、刷新容器

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

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

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

SpringBoot源码分析:SpringBoot启动源码(一)_第23张图片

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

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

SpringBoot源码分析:SpringBoot启动源码(一)_第24张图片

(八)执行Runners

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

SpringBoot源码分析:SpringBoot启动源码(一)_第25张图片

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

SpringBoot源码分析:SpringBoot启动源码(一)_第26张图片

参考文章:

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

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

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

你可能感兴趣的:(Spring,spring,boot,java,spring)