SpringBoot启动流程与源码
一 main方法作为程序的入口,执行SpringApplication.run(),传入参数是启动类的class对象@SpringBootApplication注解

二 run中首先new SpringApplication对象,然后调用该对象的run方法,返回是一个ConfigurableApplicationContext对象。

三 这里我们先看new SpringApplication的时候会进行什么操作,run方法随后在看,这段代码中的每一步依次来说:
1.使用了Assert.notNull来判断空值是一个良好的习惯,Assert类来自core的org.springframework.util包下,该包提供了很多工具类,之后会单独有一篇介绍 spring提供给我们好用的工具类的文章。
2.其中会deduceFromClasspath(deduce意为“推断”)应用类型是servlet还是reactive

classPath中这三个最少有一个

并且这两个全都有才是一个web应用

3.getSpringFactoriesInstance(ApplicationContextInitiliazer.class)方法从spring-boot包下的"META-INF/spring.factories"路径加载ClassLoader

该文件:

这种方式更容易看懂共有八个接口分别对应多个实现类:
其中只取key为ApplicationContextInitializer的value返回,该value是个List<String>,是实现了ApplicationContextInitializer接口的实现类名称,以“,”分隔

然后将这些类进行加载,这些类指的是:

之后同样的方式加载ApplicationListener接口的实现类:
4.判定主程序是哪个类
通过遍历栈信息,找到调用main方法的类型,将其加载,赋值给变量mainApplicationClass


四 SpringApplication的run方法
其中重要的逻辑都用黄色框圈了出来:

1.加载所有的监听器,和上述一样,加载指定好的类都是根据spring.factories中的对应的监听器,加载EventPublishingRunListener,之后调用该类的starting:


之后调用该类的starting方法,对之前加载的所有ApplicationListener根据事件类型进行广播事件(multicastEvent):


2.准备容器环境,会依据之前推断(deduce)的应用类型返回对应的环境对象: 

之后由监听器执行enviromentPrepared方法,其中需要注意的是会有一个监听器叫:ConfigFileApplicationListener,该接口的实现类会实际加载yml或.properties的配置文件:



随后在执行ConfigFileApplicationLitener的postProcessEnviroment方法时,会加载factories的PropertySourceLoader对应的实现类:

来加载yml或.properties中的配置,至此,容器环境配置完成。
3.创建容器上下文createApplicationContext(),也是依据之前的应用类型推断结果:

之后准备容器上下文:

首先将创建的context中的enviroment全部替换为springApplication中刚刚创建的enviroment,然后向context中注册beanfactory:

然后用当前context作为参数,调用springApplication中所有的intilizer实现类执行,intilize方法,其中重点关注COnfigurationWaringsApplicationContextInitializer类的该方法:


所有的listener执行contetxPrepared方法,之后向beanfacotry中注册两个参数,之后是load方法:

创建了一个beanDefinitionLoader对象,该对象最主要支持了xml加载和annotated加载方式,加载所有source中的对象,这里只有一个主类,被@Component注解(注解继承),将其注入到beanfactory中的beanDefinitionMap中

在refreshContext中会加载所有的bean到beanFactory中:



至此,就将所有的bean由容器来管理。
SpringBoot启动流程与源码的更多相关文章
- SpringBoot启动嵌入式tomcat源码解读
一.SpringBoot自动拉起Tomcat SpringBoot框架是当前比较流行的java后端开发框架,与maven结合大大简化了开发人员项目搭建的步骤,我们知道SpringBoot的启动类启动后 ...
- 从SpringBoot启动,阅读源码设计
目录 一.背景说明 二.SpringBoot工程 三.应用上下文 四.资源加载 五.应用环境 六.Bean对象 七.Tomcat服务 八.事件模型 九.配置加载 十.数据库集成 十一.参考源码 服务启 ...
- Spring源码解析02:Spring IOC容器之XmlBeanFactory启动流程分析和源码解析
一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别.本篇就以BeanFactory基 ...
- Spring源码解析 | 第二篇:Spring IOC容器之XmlBeanFactory启动流程分析和源码解析
一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别.本篇就以BeanFactory基 ...
- SpringBoot启动流程解析
写在前面: 由于该系统是底层系统,以微服务形式对外暴露dubbo服务,所以本流程中SpringBoot不基于jetty或者tomcat等容器启动方式发布服务,而是以执行程序方式启动来发布(参考下图ke ...
- SpringBoot启动流程分析(五):SpringBoot自动装配原理实现
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- SpringBoot启动流程分析(六):IoC容器依赖注入
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- SpringBoot启动流程分析(一):SpringApplication类初始化过程
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- SpringBoot启动流程分析(二):SpringApplication的run方法
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
随机推荐
- flutter 日志工具类
class LogUtils { //dart.vm.product 环境标识位 Release为true debug 为false static const bool isRelease = con ...
- flutter Draggable Widget拖拽控件
Draggable Widget Draggable控件负责就是拖拽,父层使用了Draggable,它的子元素就是可以拖动的,子元素可以实容器,可以是图片.用起来非常的灵活. 参数说明: data: ...
- 【转载】 十图详解tensorflow数据读取机制(附代码)
原文地址: https://zhuanlan.zhihu.com/p/27238630 何之源 深度学习(Deep Learning) 话题的优秀回答者 --------------- ...
- 算法习题---5-1代码对齐(UVa1593)
一:题目 将不规范的若干行代码进行对齐.对齐按照最长字符串进行操作.见样例输入 (一)样例输入 ␣␣start:␣␣integer;␣␣␣␣//␣begins␣here stop:␣integer;␣ ...
- CharUtil
package com.opslab.util; import java.io.UnsupportedEncodingException; /** * Various character and ch ...
- PAT 甲级 1065 A+B and C (64bit) (20 分)(溢出判断)*
1065 A+B and C (64bit) (20 分) Given three integers A, B and C in [−], you are supposed to tell whe ...
- [ kvm ] 学习笔记 4:KVM 高级功能详解
1. 半虚拟化驱动 1.1 virtio 概述 KVM 是必须使用硬件虚拟化辅助技术(如 Intel VT-x .AMD-V)的 Hypervisor,在CPU 运行效率方面有硬件支持,其效率是比较高 ...
- 单元测试-测试技术(Unit Test)
1.1白盒测试和单元测试的区别的论述: 1) 单元测试和白盒测试是不同的,虽然单元测试和白盒测试都是关注功能,虽然他们都需要代码支持,但是级别不同, 白盒测试关注的是类中一个方法的功能是更小的单位,但 ...
- C++标准模板库STL算法与自适应容器(栈和队列)
参考<21天学通C++>第23与第24章节,对STL算法与自适应容器进行介绍. 实际上在前面的STL顺序容器.关联容器进行介绍时或多或少引用到了一些STL算法中的模板函数.而自适应容器是在 ...
- oracle 存储过程详细介绍(创建,删除存储过程,参数传递等)
这篇文章主要介绍了oracle 创建,删除存储过程,参数传递,创建,删除存储函数,存储过程和函数的查看,包,系统包等相关资料,需要的朋友可以参考下 oracle 创建,删除存储过程,参数传递,创建 ...