介绍一下Spring Boot启动流程以及生命周期勾子函数?
代码那些事儿 2020-02-22 16:10:15
上篇文章介绍了Spring Boot自动配置的原理,但是对于Spring Boot应用的整个启动流程还是一头雾水,虽然Spring Boot大大简化了我们的代码配置工作,但是对于内部原理我们还是需要了解一下的。本篇文章我们主要对照源码介绍一下应用启动入口SpringApplication.run()方法的整个执行流程。
SpringApplication构造函数
首先我们进到run()方法里,这里可以看到构造了一个SpringApplication对象,继续进构造方法看一下
构造方法里主要做了四件事:
- 根据classpath下是否存在某些特定类来确定应用的类型,包括:REACTIVE、SERVLET和NONE三种类型,其中REACTIVE、SERVLET会以WEB应用的形式启动,NONE则会在应用执行完毕后结束进程
- 利用SpringFactoriesLoader自动加载spring.factories文件中配置的 ApplicationContextInitializer,ApplicationContextInitializer原本是Spring框架Context模块下的一个接口,Spring Boot内部提供了一些该接口的实现类,使得我们有机会对ApplicationContext做一些特定的初始化工作
- 利用SpringFactoriesLoader自动加载spring.factories文件中配置的 ApplicationListener,ApplicationListener同样是Context模块下的接口,Spring Boot内部提供了一些该接口的实现类,使得我们有机会在监听到某些应用事件发生时做一些特定的工作。
- 根据main方法执行堆栈确定应用的主引导类,即Spring Boot项目自带的XXApplication类
run方法
对照应用启动的整个生命周期回调函数,run方法内部大致可分为六个主要步骤:
- 利用SpringFactoriesLoader自动加载spring.factories文件中配置的SpringApplicationRunListener后,回调starting方法,表示run()方法开始执行
- 根据配置文件及参数构建Environment结束时,回调environmentPrepared方法,表示应用的Environment已准备好
- 打印banner,创建ApplicationContext,设置好Environment并初始化结束时,回调contextPrepared方法,表示应用的ApplicationContext已准备好
- 在ApplicationContext将所有已经扫描到的beans加载完成时,回调contextLoaded方法,表示ApplicationContext 已经加载完成
- 当ApplicationContext刷新结束并完成后续启动后,回调started方法,表示应用已经启动
- 遍历执行应用所有的CommandLineRunner结束后,回调running方法,表示应用正在运行
控制台输出
分析了这么多,最后我们启动应用看一下控制台输出是不是上面这个流程。
想要监听到Spring Boot应用启动生命周期的回调,首先我们需要自定义一个SpringApplicationRunListener接口实现类:
同时,我们在resources目录下创建spring.factories文件:
接下来我们启动应用,等待控制台输出:
通过与上面run方法执行流程对比,可以确定Spring Boot应用启动过程与我们分析的基本一致。
介绍一下Spring Boot启动流程以及生命周期勾子函数?相关推荐
- Spring Boot————Spring Boot启动流程分析
一.引言 Spring Boot 的启动虽然仅仅是执行了一个main方法,但实际上,运行流程还是比较复杂的,其中包含几个非常重要的事件回调机制.在实际生产开发中,有时候也会利用这些启动流程中的回调机制 ...
- vue项目下props传进去的数据,生命周期勾子函数包括watch不触发的解决办法
vue项目下props传进去的数据,生命周期勾子函数包括watch不触发的解决办法 @TOC 遇到的问题 在深层props过程中,props的数据传到了目标文件 但却没有触发数据更新及页面更新: wa ...
- Android 深入研究之 ✨ Activity启动流程+Activity生命周期✨
Activity分析目录 前言 Activity生命周期 1.activity的四个状态 2.activity的生命周期 3.activity优先级 Activity启动流程 Activity的启动流 ...
- spring boot 启动流程分析
spring boot 框架凭借极简配置,一键运行和强大的第三方框架集成等特点,受到广大开发者的青睐,基本成为java开发中必不可少的基础的框架.spirng boot带给我们这么多便利的背后,它都做 ...
- 【安卓 R 源码】Activity 启动流程及其生命周期源码分析
1. Activty 的生命周期 activity的生命周期 oncreate()->onstart()->onResume()->onPause()->onStop()-&g ...
- Spring Boot 启动流程
写作中- //org.springframework.boot.SpringApplication#run(java.lang.String...) public ConfigurableApplic ...
- Spring Boot + BPMN流程管理引擎实践
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Spring Boot + BPMN流程管理引擎实践 前言 一.什么是BPMN? 1. BPMN标准及其核心组件介绍 2. 为什么要使 ...
- Spring Boot启动过程源码分析--转
https://blog.csdn.net/dm_vincent/article/details/76735888 关于Spring Boot,已经有很多介绍其如何使用的文章了,本文从源代码(基于Sp ...
- 在Spring Boot启动时运行代码
Spring Boot会自动为我们执行很多配置,但是迟早您将不得不做一些自定义工作. 在本文中,您将学习如何进入应用程序引导生命周期并在Spring Boot启动时执行代码 . 因此,让我们看看该框架 ...
最新文章
- C++_STL——list(and forward_list)
- ACL2020 | 无监督?无监督!你没试过的BERT的全新用法
- 随机发送n位数字+字母的验证码
- A - Sliding Window POJ - 2823
- 浅谈本地服务器的搭建 XAMPP
- ASP.NET Core 基础教程 - ASP.NET Core 基础教程 - 简单教程,简单编程
- K8s与Docker
- 容器转换类型,列表,集合,字典推导式
- 剑指offer面试题32 - II. 从上到下打印二叉树 II(二叉树)(BFS)
- 团队第二次冲刺第一天
- java 字符串首字符大写_Java字符串为大写
- 正则匹配获取中括号中的内容
- MongoDb系列文章
- iOS多线程(一):GCD的基本使用
- 常用的网络传输协议:UDP和TCP
- 动态规划之详细分析0-1背包问题
- kernel打印模块驱动加载时间
- Google maps及51ditu的图片切割及存储方法
- 集群使用calico的bgp+ipip混合模式部署
- 快速傅里叶变换(FFT)的原理及公式
热门文章
- 【转】LINUX内核编译步骤详细介绍
- 平面设计 php哪个有发展,平面设计是干什么的?
- 愤怒的小鸟太空版下载游戏
- domino 使用java,在Domino中使用JavaServerlet
- domino web开发 使用原生的视图
- 最近火起的 Bean Searcher 与 MyBatis Plus 倒底有啥区别?
- 网页白底蓝字,尝试各种办法都没有解决,最后…
- vue手把手带你创建聊天室(vue-native-websocket)
- 女孩子适合学计算机专业么,女生学计算机专业好吗 有哪些优势
- 于殿泓 图像检测与处理技术_图像检测与处理技术(21世纪高等学校仪器仪表及自动化类专业规划教材)...