1.前言


  最近一直在看Springboot和springcloud代码,看了将近20多天,对这两个系统的认知总算是入了门。后续应该会有一个系列的文章,本文就先从Springboot的启动入手.

2.容器初始化


上面的代码是Springboot的入口,现在从run方法进去

点击进来后到了这里就会分成两步

1.生成一个SpringApplication对象
2.调用生成的对象的run方法

2.1】我们先看SpringApplication的构造器是如何生成一个SpringApplication对象

1.推断程序类型,推断规则在2.1.1

2.查找ApplicationContextInitializer的实现类,ApplicationContextInitializer是Spring框架的接口,在ApplicationContext的初始化之前,需要逐一调用ApplicationContextInitializer的实现类的initialize方法。

3.查找中ApplicationListener的实现类,Springboot大量的采用了事件监听机制,ApplicationListener负责将监听事件并广播出去。后续我们会详细讲解

【2.1.1】判断程序类型

至此SpringApplication构造初始化就完成了。

3.容器启动


调用生成的对象的run方法

【3.1】记录时间

Springboot内部记录流程节点花费时间的工具类

【3.2】获取ApplicationRunListener

这里通过SpringApplicationRunListeners 封装了多个SpringApplicationRunListener。在容器的启动过程中,springboot将这个过程分为了五步

started(run方法执行的时候立马执行;对应事件的类型是ApplicationStartedEvent)
environmentPrepared(ApplicationContext创建之前并且环境信息准备好的时候调用;对应事件的类型是ApplicationEnvironmentPreparedEvent)
contextPrepared(ApplicationContext创建好并且在source加载之前调用一次;没有具体的对应事件)
contextLoaded(ApplicationContext创建并加载之后并在refresh之前调用;对应事件的类型是ApplicationPreparedEvent)
finished(run方法结束之前调用;对应事件的类型是ApplicationReadyEvent或ApplicationFailedEvent)

同时,SpringApplicationRunListener 只有一个实现类 EventPublishingRunListener,所以上述5个步骤的最终实现都会在 EventPublishingRunListener中。

我们看看start方法

这里的 ApplicationStartedEvent 继承 SpringApplicationEvent

再看publishEvent是如何把Event推送出去的

看到这边,发现最后发送event的还是ApplicationListener

这里一整套的封装,就是为了这边发送事件

【3.3】创建容器

【3.3.1】创建Environment

【3.3.2】创建容器

【3.3.3】SpringApplication的init

找到所有ApplicationContextInitializer的实现类,调用他们的initialize方法。

【3.3.4】加载mainsource到容器

【3.3.5】refresh,BeanFactory的设置,BeanFactoryPostProcessor接口的执行、BeanPostProcessor接口的执行、自动化配置类的解析、条件注解的解析、国际化的初始化

【3.4】容器创建之后

【3.4.1】Runer实现类

调用ApplicationRunner和CommandLineRunner的实现类

4.Springboot启动的扩展


上述讲了springboot的启动流程,那如果我们想在启动的时候自定义一些操作,可以考虑以下几种方式。

【4.1】对容器的操作

实现  ApplicationContextInitializer 接口,重写initialize方法

需要注意的是,这个bean需要在META-INF/spring.factories中注册上才可以被扫描到

【4.2】监听5大事件

实现 ApplicationListener

【4.3】实现 ApplicationRunner 或者 CommandLineRunner

以上,就是Springboot的启动流程,里面还有几处细节,后续会慢慢更新

Springboot 启动详解的更多相关文章

  1. springboot配置详解

    springboot配置详解 Author:SimpleWu properteis文件属性参考大全 springboot默认加载配置 SpringBoot使用两种全局的配置文件,全局配置文件可以对一些 ...

  2. 深入浅出mybatis之启动详解

    深入浅出mybatis之启动详解 MyBatis功能丰富,但使用起来非常简单明了,今天我们来追踪一下它的启动过程. 目录 如何启动MyBatis 如何使用MyBatis MyBatis启动过程 如何启 ...

  3. springboot项目--传入参数校验-----SpringBoot开发详解(五)--Controller接收参数以及参数校验----https://blog.csdn.net/qq_31001665/article/details/71075743

    https://blog.csdn.net/qq_31001665/article/details/71075743 springboot项目--传入参数校验-----SpringBoot开发详解(五 ...

  4. SpringBoot @ConfigurationProperties详解

    文章目录 简介 添加依赖关系 一个简单的例子 属性嵌套 @ConfigurationProperties和@Bean 属性验证 属性转换 自定义Converter SpringBoot @Config ...

  5. Spring Boot2 系列教程 (二) | 第一个 SpringBoot 工程详解

    微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 哎呦喂,按照以往的惯例今天周六我的安排应该是待在家学学猫叫啥的.但是今年这种日子就可能一去不复返了,没法办法啊.前 ...

  6. Linux 启动详解之init

    1.init初探 init是Linux系统操作中不可缺少的程序之一.init进程,它是一个由内核启动的用户级进程,然后由它来启动后面的任务,包括多用户环境,网络等. 内核会在过去曾使用过init的几个 ...

  7. Linux启动详解

    <概述> Linux启动大致分为一下几个步骤,详细的启动步骤在<启动分析>中详解. 1:首先bios加电自检,初始化(这个过程会检测相关硬件(cpu,内存,显卡,硬盘等)) 2 ...

  8. Linux开机启动详解

    Linux开机启动程序详解 我们假设大家已经熟悉其它操作系统的引导过程,了解硬件的自检引导步骤,就只从Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始,介绍Linux开机引导的步骤 ...

  9. Hadoop- 集群启动详解

    NameNode启动过程详解 第一次启动:HDFS格式化后,生成fsimage文件 hdf

随机推荐

  1. C#的app.Config文件中设置,可以选择执行环境(左配置,有程序),app.Config中的appSettings首字母必须小写,符合源码要求

  2. python3 利用pip命令安装包和模块

    本文介绍如何利用pip命令安装Python相关的包和模块.在Python中有些方法或者模块是自带的功能,也叫(build-in),内构函数,实际使用,可能内构函数或者模块不能完成我们的任务,我们就需要 ...

  3. .gitignore语法

    没嘛用 “#”表示注释 “!”表示取消忽略 空行不作匹配 若匹配语句中无“/ ” ,便将其视为一个 glob匹配,如'abc'可以匹配 ' abc' , 'cd/abc' , 'ef/abcde.tx ...

  4. 对list遍历删除符合的数据

      例子

  5. 初探ansible

    Ansible 基于ssh的自动化运维工具 ansible 配置文件详解 ansible.cfg 文件 文件默认放置在/etc/ansible下,ansible读取配置文件的顺序是: 当前命令执行目录 ...

  6. Python学习过程中各个难点---数据类型篇

    ---恢复内容开始--- 当时在学习python的基本数据类型时,对于可变与不可变类型不是了解的很透彻,这篇是回过头来自己的一些理解. 可变的数据类型有列表,不可变的数据类型有字符串,数字和元组   ...

  7. Monad Explained in One Picture

    The point of Monad is composability. In the green category, T -> Monad<U> and U -> Monad ...

  8. jenkins在windows服务器上执行含git push命令的脚本权限不足的解决方法

    错误摘要 默认情况下执行脚本是没问题的,但是脚本中含有git push命令就无法执行了 用jenkins部署hexo博客时候遇到的,执行hexo d -g一直阻塞至Build was aborted, ...

  9. Maven整合SSM测试

    前面也说到了关于SSM的整合,话不多说直接从创建项目开始CRUD之路(参考前面写过的Mybatis和Spring整合,SSM简单整合),这是整个项目的结构 以及最终的结果.(附上下载地址) 一.创建M ...

  10. python爬虫学习之Scrapy框架的工作原理

    一.Scrapy简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了 页面抓取 (更确切来说, 网 ...