代码那些事儿 2020-02-22 16:10:15

上篇文章介绍了Spring Boot自动配置的原理,但是对于Spring Boot应用的整个启动流程还是一头雾水,虽然Spring Boot大大简化了我们的代码配置工作,但是对于内部原理我们还是需要了解一下的。本篇文章我们主要对照源码介绍一下应用启动入口SpringApplication.run()方法的整个执行流程。

SpringApplication构造函数

首先我们进到run()方法里,这里可以看到构造了一个SpringApplication对象,继续进构造方法看一下

构造方法里主要做了四件事:

  1. 根据classpath下是否存在某些特定类来确定应用的类型,包括:REACTIVE、SERVLET和NONE三种类型,其中REACTIVE、SERVLET会以WEB应用的形式启动,NONE则会在应用执行完毕后结束进程
  2. 利用SpringFactoriesLoader自动加载spring.factories文件中配置的 ApplicationContextInitializer,ApplicationContextInitializer原本是Spring框架Context模块下的一个接口,Spring Boot内部提供了一些该接口的实现类,使得我们有机会对ApplicationContext做一些特定的初始化工作
  3. 利用SpringFactoriesLoader自动加载spring.factories文件中配置的 ApplicationListener,ApplicationListener同样是Context模块下的接口,Spring Boot内部提供了一些该接口的实现类,使得我们有机会在监听到某些应用事件发生时做一些特定的工作。
  4. 根据main方法执行堆栈确定应用的主引导类,即Spring Boot项目自带的XXApplication类

run方法

对照应用启动的整个生命周期回调函数,run方法内部大致可分为六个主要步骤:

  1. 利用SpringFactoriesLoader自动加载spring.factories文件中配置的SpringApplicationRunListener后,回调starting方法,表示run()方法开始执行
  2. 根据配置文件及参数构建Environment结束时,回调environmentPrepared方法,表示应用的Environment已准备好
  3. 打印banner,创建ApplicationContext,设置好Environment并初始化结束时,回调contextPrepared方法,表示应用的ApplicationContext已准备好
  4. 在ApplicationContext将所有已经扫描到的beans加载完成时,回调contextLoaded方法,表示ApplicationContext 已经加载完成
  5. 当ApplicationContext刷新结束并完成后续启动后,回调started方法,表示应用已经启动
  6. 遍历执行应用所有的CommandLineRunner结束后,回调running方法,表示应用正在运行

控制台输出

分析了这么多,最后我们启动应用看一下控制台输出是不是上面这个流程。

想要监听到Spring Boot应用启动生命周期的回调,首先我们需要自定义一个SpringApplicationRunListener接口实现类:

同时,我们在resources目录下创建spring.factories文件:

接下来我们启动应用,等待控制台输出:

通过与上面run方法执行流程对比,可以确定Spring Boot应用启动过程与我们分析的基本一致。

介绍一下Spring Boot启动流程以及生命周期勾子函数?相关推荐

  1. Spring Boot————Spring Boot启动流程分析

    一.引言 Spring Boot 的启动虽然仅仅是执行了一个main方法,但实际上,运行流程还是比较复杂的,其中包含几个非常重要的事件回调机制.在实际生产开发中,有时候也会利用这些启动流程中的回调机制 ...

  2. vue项目下props传进去的数据,生命周期勾子函数包括watch不触发的解决办法

    vue项目下props传进去的数据,生命周期勾子函数包括watch不触发的解决办法 @TOC 遇到的问题 在深层props过程中,props的数据传到了目标文件 但却没有触发数据更新及页面更新: wa ...

  3. Android 深入研究之 ✨ Activity启动流程+Activity生命周期✨

    Activity分析目录 前言 Activity生命周期 1.activity的四个状态 2.activity的生命周期 3.activity优先级 Activity启动流程 Activity的启动流 ...

  4. spring boot 启动流程分析

    spring boot 框架凭借极简配置,一键运行和强大的第三方框架集成等特点,受到广大开发者的青睐,基本成为java开发中必不可少的基础的框架.spirng boot带给我们这么多便利的背后,它都做 ...

  5. 【安卓 R 源码】Activity 启动流程及其生命周期源码分析

    1. Activty 的生命周期 activity的生命周期 oncreate()->onstart()->onResume()->onPause()->onStop()-&g ...

  6. Spring Boot 启动流程

    写作中- //org.springframework.boot.SpringApplication#run(java.lang.String...) public ConfigurableApplic ...

  7. Spring Boot + BPMN流程管理引擎实践

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Spring Boot + BPMN流程管理引擎实践 前言 一.什么是BPMN? 1. BPMN标准及其核心组件介绍 2. 为什么要使 ...

  8. Spring Boot启动过程源码分析--转

    https://blog.csdn.net/dm_vincent/article/details/76735888 关于Spring Boot,已经有很多介绍其如何使用的文章了,本文从源代码(基于Sp ...

  9. 在Spring Boot启动时运行代码

    Spring Boot会自动为我们执行很多配置,但是迟早您将不得不做一些自定义工作. 在本文中,您将学习如何进入应用程序引导生命周期并在Spring Boot启动时执行代码 . 因此,让我们看看该框架 ...

最新文章

  1. C++_STL——list(and forward_list)
  2. ACL2020 | 无监督?无监督!你没试过的BERT的全新用法
  3. 随机发送n位数字+字母的验证码
  4. A - Sliding Window POJ - 2823
  5. 浅谈本地服务器的搭建 XAMPP
  6. ASP.NET Core 基础教程 - ASP.NET Core 基础教程 - 简单教程,简单编程
  7. K8s与Docker
  8. 容器转换类型,列表,集合,字典推导式
  9. 剑指offer面试题32 - II. 从上到下打印二叉树 II(二叉树)(BFS)
  10. 团队第二次冲刺第一天
  11. java 字符串首字符大写_Java字符串为大写
  12. 正则匹配获取中括号中的内容
  13. MongoDb系列文章
  14. iOS多线程(一):GCD的基本使用
  15. 常用的网络传输协议:UDP和TCP
  16. 动态规划之详细分析0-1背包问题
  17. kernel打印模块驱动加载时间
  18. Google maps及51ditu的图片切割及存储方法
  19. 集群使用calico的bgp+ipip混合模式部署
  20. 快速傅里叶变换(FFT)的原理及公式

热门文章

  1. 【转】LINUX内核编译步骤详细介绍
  2. 平面设计 php哪个有发展,平面设计是干什么的?
  3. 愤怒的小鸟太空版下载游戏
  4. domino 使用java,在Domino中使用JavaServerlet
  5. domino web开发 使用原生的视图
  6. 最近火起的 Bean Searcher 与 MyBatis Plus 倒底有啥区别?
  7. 网页白底蓝字,尝试各种办法都没有解决,最后…
  8. vue手把手带你创建聊天室(vue-native-websocket)
  9. 女孩子适合学计算机专业么,女生学计算机专业好吗 有哪些优势
  10. 于殿泓 图像检测与处理技术_图像检测与处理技术(21世纪高等学校仪器仪表及自动化类专业规划教材)...