首页 > 其他分享 >Springboot 启动流程

Springboot 启动流程

时间:2023-08-12 23:33:15浏览次数:35  
标签:初始化 读取 启动 容器 流程 Springboot 上下文 加载

整体流程

1.SpringApplication 静态调用run 方法,从静态run 方法中new 一个自己的实例,并调用实例的run方法。

Springboot 启动流程_加载

2.构造方法中会初始化容器一些属性,主要是初始化两个数据集合:
a.配置文件中以ApplicationContextInitializer为 key 的初始化器的实例集合。
b.配置文件中以ApplicationListener为key 的程序启动监听器的实例集合。
以及推断出类的WebApplicationType(REACTIVE\SERVLET\NONE)
和启动类mainApplicationClass。

Springboot 启动流程_初始化_02

3.run方法启动流程:

Springboot 启动流程_初始化_03

主要有6步:
a.获取并启动监听的listeners
b.初始化应用环境
c.初始化应用上下文
d.刷新应用上下文前的准备工作
e.刷新应用上下文
f.刷新应用上下文之后的扩展功能

4.ApplicationContextInitializer 与监听器的读取
a.调用SpringApplication#getSpringFactoriesInstances,传入需要预先加载的初始化器的类型

Springboot 启动流程_加载_04

b.因为是第一次加载,缓存中没有从配置文件中读取所有的数据。因此根据classloader读取所有模块META-INF/spring.factories中的配置数据,以map<String,List<String>>形式存储在缓存中。

Springboot 启动流程_加载_05

c.读取b路径下的配置数据详情

Springboot 启动流程_加载_06

可以看到,ApplicationContextInitializer对应的初始化器有7个

Springboot 启动流程_初始化_07

初始化器的详情

Springboot 启动流程_加载_08

d.初始化器实例初始化

Springboot 启动流程_初始化_09

e.应用的监听listeners,加载方式同上述的初始化器的加载流程,

Springboot 启动流程_spring_10

5.run启动流程
1.读取SpringApplicationRunListener ,依旧是读取的从配置文件中的数据,同上方加载流程相同

Springboot 启动流程_初始化_11

2.初始化应用环境

Springboot 启动流程_加载_12

a.创建应用环境

Springboot 启动流程_加载_13

b.配置环境属性

Springboot 启动流程_加载_14

c.通知环境数据加载完成

Springboot 启动流程_spring_15

3.创建应用上下文

Springboot 启动流程_spring_16

根据应用类型,读取对应的类的全路径名称,并初始化

Springboot 启动流程_spring_17

4.应用上下文刷新前的准备工作

Springboot 启动流程_加载_18

加载启动类流程

Springboot 启动流程_spring_19

Springboot 启动流程_spring_20

5.刷新应用上下文
进入spring容器得的refresh 方法,主要观察invokeBeanFactoryPostProcessors 实现

Springboot 启动流程_spring_21

进入方法后,其实是调用了代理类的invokeBeanFactoryPostProcessors

Springboot 启动流程_spring_22

继续进入后,读取beanFactoryProcessors,两个初始化器和一个listener 的processor

Springboot 启动流程_初始化_23

经过寻找,得到类型为BeanDefinitionRegistryPostProcessor 的容器name ,在根据name从容器中获取实例集合,本次只有一个--org.springframework.context.annotation.internalConfigurationAnnotationProcessor

Springboot 启动流程_加载_24

继续向下,进入invokeBeanDefinitionRegistryPostProcessors,触发ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry

Springboot 启动流程_初始化_25

调用自身的processConfigBeanDefinitions,里面会初始化ConfigurationClassParser

Springboot 启动流程_spring_26

进入parse方法

Springboot 启动流程_加载_27

一直深入到doProcessConfigurationClass中,该方法会被递归调用,里面会扫描Component注解的类,并将需要import的配置类也收集到一起

Springboot 启动流程_加载_28

Springboot 启动流程_初始化_29

解析配置后,获取解析结果,可以看到系统的配置类与自定义得controller 都解析到了

Springboot 启动流程_spring_30

之后就是执行spring容器流程了
fancoder:Spring 源码浅析

@SpringBootApplication注解
集合注解,集合了三个注解:

Springboot 启动流程_初始化_31

@SpringBootConfiguration主要是封装了@Configuration

Springboot 启动流程_加载_32

@EnableAutoConfiguration集成了两个注解

Springboot 启动流程_spring_33

@AutoConfigurationPackage,封装了@Import,导入了AutoConfigurationPackages.Registrar,自动封装包

Springboot 启动流程_初始化_34

根据注解元信息,获取包名,注册到容器

Springboot 启动流程_加载_35

将启动类所在的包名作为跟路径存到容器

Springboot 启动流程_加载_36

@Import 导入AutoConfigurationImportSelector
主要负责将spring.facotries中的配置自动配置类EnableAutoConfiguration对应的配置类加载到容器

Springboot 启动流程_spring_37

标签:初始化,读取,启动,容器,流程,Springboot,上下文,加载
From: https://blog.51cto.com/u_15668812/7062626

相关文章

  • 学习go语言编程之流程控制
    Golang支持如下4种流程控制语句:条件语句:if,else和elseif选择语句:switch,case和select循环语句:for,range跳转语句:goto条件语句示例代码:a:=3ifa<5{fmt.Println(a,"litterthan5")}else{fmt.Println(a,"notlitterthan5")}关于条件语句,要注意以下......
  • ASPICE流程编码和单元测试
    ASPICE流程编码和单元测试是指根据详细设计,编写符合ASPICE标准的代码,并对每个模块进行单元测试。这一过程包括以下步骤:编写代码:根据详细设计,编写符合ASPICE标准的代码,确保代码质量和可维护性。代码审查:对编写好的代码进行审查,发现并纠正潜在问题,确保代码质量和可靠性。单元测试计划......
  • servlet系列:简介和基本使用以及工作流程
    目录一、简介二、Servlet实现三、基本使用1.引入pom依赖2.实现Servlet规范,重写service方法3.配置web.xml4.配置Tomcat6.运行四、Servlet的工作流程一、简介Servlet是Server与Applet的缩写,是服务端小程序的意思。使用Java语言编写的服务器端程序,可以生成动态的WEB页,Serv......
  • IDEA集成docker并快速部署Springboot项目
    前言:现在docker是我们常用的服务部署方式了,在微服务中对于springboot部署到docker一般有两种方式1、把jar包扔给运维同学,由他们进行编写dockerfile或者其他方式部署。(不推荐)2、由开发同学处理后把镜像或者容器上传到服务器(企业级常用方式)下面我们就通过demo来看下方式二......
  • JavaScript之流程控制
    1流程控制2顺序流程空制顺序结构是程序中最简单、最基本的流程控制,它没有特定的语法结构,程序会按照(代码的先后顺序,依次执行)程序中大多数的代码都是这样执行的。3分支流程控制if语句3.1分支结构3.2if语句3.2.1语法结构//条件成立执行代码,否则什么也不做if(条件表达式){/......
  • springboot集成log4j2日志
    目录Maven依赖log4j2.xml配置注释测试参考Maven依赖参考:https://docs.spring.io/spring-boot/docs/2.7.14/reference/htmlsingle/#howto.logging.log4j <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</a......
  • Springboot - 员工部门案例
    目录查询全部部门信息查询全部部门信息//知识点1:@RequestMapping(value="/list",method=RequestMethod.GET)等价于:@GetMapping("/list")//知识点2:privatestaticLoggerlogger=LoggerFactory.getLogger(DeptController.class);等价于@Slf4j(lombok.extern.slf......
  • Android系统启动-SystemServer上篇-1
    相关文件:/frameworks/base/core/java/com/android/internal/os/-ZygoteInit.java-RuntimeInit.java-Zygote.java/frameworks/base/services/java/com/android/server/-SystemServer.java/frameworks/base/core/jni/-com_android_internal_os_Zygote.cp......
  • SpringBoot3数据库集成
    标签:Jdbc.Druid.Mybatis.Plus;一、简介项目工程中,集成数据库实现对数据的增晒改查管理,是最基础的能力,而对于这个功能的实现,其组件选型也非常丰富;通过如下几个组件来实现数据库的整合;Druid连接池:阿里开源的数据库连接池,并且提供SQL执行的监控能力;MybatisPlus框架:基于Mybatis框......
  • SpringBoot3数据库集成
    标签:Jdbc.Druid.Mybatis.Plus;一、简介项目工程中,集成数据库实现对数据的增晒改查管理,是最基础的能力,而对于这个功能的实现,其组件选型也非常丰富;通过如下几个组件来实现数据库的整合;Druid连接池:阿里开源的数据库连接池,并且提供SQL执行的监控能力;MybatisPlus框架:基于Mybatis......