欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【玩转SpringBoot】SpringBoot应用的启动过程一览表

程序员文章站 2023-09-29 08:20:17
SpringBoot应用的启动方式很简单,就一行代码,如下图01: 其实这行代码背后主要执行两个方法,一个是构造方法,一个是run方法。构造方法主要内容就是收集一些数据,和确认一些信息。如下图02: 真正的执行要从run方法开始,为此,SpringBoot特意定义了一个监听器,专门监听这个run方法 ......


springboot应用的启动方式很简单,就一行代码,如下图01:


【玩转SpringBoot】SpringBoot应用的启动过程一览表


其实这行代码背后主要执行两个方法,一个是构造方法,一个是run方法。

构造方法主要内容就是收集一些数据,和确认一些信息。如下图02:

【玩转SpringBoot】SpringBoot应用的启动过程一览表


真正的执行要从run方法开始,为此,springboot特意定义了一个监听器,专门监听这个run方法的执行过程。

这个监听器的名字是,springapplicationrunlistener,如下图03:

【玩转SpringBoot】SpringBoot应用的启动过程一览表


这个接口的方法其实就表示了springboot应用的启动过程。

备注:这个监听器是springboot自己使用的,我们虽然也可以使用,但有些麻烦。

第一步,启动

当进入run方法后,首先就是获取监听器,并触发starting方法。

应用正式开始启动,如下图04:

【玩转SpringBoot】SpringBoot应用的启动过程一览表


第二步,准备环境

最先要准备好的就是environment,因为后续要使用它。

它里面的值也包含启动时的命令行参数,如下图05:

【玩转SpringBoot】SpringBoot应用的启动过程一览表


此时会触发监听器的environmentprepared方法,如下图06:

【玩转SpringBoot】SpringBoot应用的启动过程一览表


第三步,创建容器

根据应用类型创建适合的spring容器,如下图07:

【玩转SpringBoot】SpringBoot应用的启动过程一览表


第四步,准备容器

主要包括把environment设置给容器,执行容器的自定义初始化器。

同时触发监听器的contextprepared方法,如下图08:

【玩转SpringBoot】SpringBoot应用的启动过程一览表


第五步,加载资源

这里的资源主要包括应用的主类,还有用户显式设置的类名/包名/xml文件等。

加载这些资源的目的就是为了注册bean定义

然后再触发监听器的contextloaded方法,如下图09:

【玩转SpringBoot】SpringBoot应用的启动过程一览表


第六步,容器刷新

容器刷新主要包括调用“后处理器”进一步注册bean定义。

还包括对所有(非延迟加载)单例bean的实例化和初始化。如下图10:

【玩转SpringBoot】SpringBoot应用的启动过程一览表


此时,其实spring容器已经启动成功了。所以触发了监听器的started方法。

表明已经启动了,如下图11:

【玩转SpringBoot】SpringBoot应用的启动过程一览表


第七步,调用runner接口

runner接口就是容器启动成功后马上就会被执行的。它的实现类作为bean注册到容器中。

所以是从容器中拿出这些bean再执行,如下图12:

【玩转SpringBoot】SpringBoot应用的启动过程一览表


此时,启动过程需要执行的所有东西都已完成。

因此,要触发监听器的running方法,表明已经进入正常运行状态,如下图13:

【玩转SpringBoot】SpringBoot应用的启动过程一览表


run方法也已经结束了,就把容器对象返回了,如下图14:

【玩转SpringBoot】SpringBoot应用的启动过程一览表

 

(end)

 

>>> 玩转springboot系列文章 <<<

 

【玩转springboot】配置文件yml的正确打开姿势

【玩转springboot】用好条件相关注解,开启自动配置之门

【玩转springboot】给自动配置来个整体大揭秘

【玩转springboot】看似复杂的environment其实很简单

【玩转springboot】翻身做主人,一统web服务器

【玩转springboot】让错误处理重新由web服务器接管

>>> 品spring系列文章 <<<

 

品spring:帝国的基石

品spring:bean定义上梁山

品spring:实现bean定义时采用的“先进生产力”

品spring:注解终于“成功上位”

品spring:能工巧匠们对注解的“加持”

品spring:springboot和spring到底有没有本质的不同?

品spring:负责bean定义注册的两个“排头兵”

品spring:springboot轻松取胜bean定义注册的“第一阶段”

品spring:springboot发起bean定义注册的“二次攻坚战”

品spring:注解之王@configuration和它的一众“小弟们”

品spring:bean工厂后处理器的调用规则

品spring:详细解说bean后处理器

品spring:对@postconstruct和@predestroy注解的处理方法

品spring:对@resource注解的处理方法

品spring:对@autowired和@value注解的处理方法

品spring:真没想到,三十步才能完成一个bean实例的创建

品spring:关于@scheduled定时任务的思考与探索,结果尴尬了

 

>>> 热门文章集锦 <<<

 

毕业10年,我有话说

【面试】我是如何面试别人list相关知识的,深度有点长文

我是如何在毕业不久只用1年就升为开发组长的

爸爸又给spring mvc生了个弟弟叫spring webflux

【面试】我是如何在面试别人spring事务时“套路”对方的

【面试】spring事务面试考点吐血整理(建议珍藏)

【面试】我是如何在面试别人redis相关知识时“软怼”他的

【面试】吃透了这些redis知识点,面试官一定觉得你很nb(干货 | 建议珍藏)

【面试】如果你这样回答“什么是线程安全”,面试官都会对你刮目相看(建议珍藏)

【面试】迄今为止把同步/异步/阻塞/非阻塞/bio/nio/aio讲的这么清楚的好文章(快快珍藏)

【面试】一篇文章帮你彻底搞清楚“i/o多路复用”和“异步i/o”的前世今生(深度好文,建议珍藏)

【面试】如果把线程当作一个人来对待,所有问题都瞬间明白了

java多线程通关———基础知识挑战

品spring:帝国的基石

 

作者是工作超过10年的码农,现在任架构师。喜欢研究技术,崇尚简单快乐。追求以通俗易懂的语言解说技术,希望所有的读者都能看懂并记住。下面是公众号的二维码,欢迎关注!

【玩转SpringBoot】SpringBoot应用的启动过程一览表