首先分享之前的所有文章 , 欢迎点赞收藏转发三连下次一定 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164…
Github : 👉 github.com/black-ant
CASE 备份 : 👉 gitee.com/antblack/ca…
一 . 前言
这一篇来说一说 SpringBoot Application 的主流程.
SpringAppliation 的主流程入口很简单 :
1  | java复制代码@SpringBootApplication  | 
我们从这个入口一步步看看 , 这个流程里面到底做了什么 , 其中主要涉及这几件事:
- 创建且启动 listener
 - 通过 args 生成 environment
 - 通过 environment 创建 context
 - 刷新 context
 - 当然 , 还会打印 Banner
 
流程图
二 . 流程解析
2.1 SpringApplication 核心流程
核心流程主要在SpringApplication.class 中 ,我们从这个流程看看:
SpringApplication 属性
1  | java复制代码F- resourceLoader  | 
SpringApplication run 方法主流程
1  | java复制代码M1_01- run()  | 
SpringApplication 主流程伪代码
1  | java复制代码public ConfigurableApplicationContext run(String... args) throws Exception {  | 
2.2 子模块 : Enviroment 处理
1  | java复制代码M1_21- prepareEnvironment  | 
configureIgnoreBeanInfo 配置
1  | java复制代码// 其中仅设置了2个属性 :  | 
2.3 Banner 的打印
纯粹是好奇 , 过来看一眼
1  | java复制代码  | 
- 提供了一个开关
 - 构建一个 SpringApplicationBannerPrinter ,
 - 调用 print 生成了一个 Banner 对象
 
2.4 createApplicationContext 逻辑
该逻辑为创建 ApplicationContext 的相关逻辑 , 这里先简单过一下 :
1  | java复制代码  | 
PS:M1_01_03 生成一个 ConfigurableApplicationContext
PS : ApplicationContext 体系结构
这里补充一下 Reactive 的区别
如图所示 , Reactive 是 Spring 中一个重要的技术栈 , Reactive 可以用于构建响应性、弹性、弹性和消息驱动的企业级反应系统.
WebFlux 并不是 Spring MVC 替代,它主要应用还是在异步非阻塞编程模型上 , 使用了 WebFlux 的应用,其整体响应时间更短,启动的线程数更少,使用的内存资源更少。同时,延迟越大,WebFlux 的优势越明显。
具体可以参考这篇文档 @ blog.csdn.net/u010862794/…
2.5 中间操作
M1_11 获取 SpringBootExceptionReporter 的处理类
1  | java复制代码getSpringFactoriesInstances(SpringBootExceptionReporter.class,new Class[] { ConfigurableApplicationContext.class }, context);  | 
M1_12 callRunners : 干什么
该方法主要是运行 ApplicationRunner
1  | java复制代码// callRunners 主流程  | 
2.6 Context 的三次处理
Context 的二次处理分为 三步 :
- prepareContext(context, environment, listeners, applicationArguments, printedBanner);
- 设置 Context 的前置属性
 
 - refreshContext(context);
- 注入 Bean , 注册监听器 , 初始化并发布事件
 
 - afterRefresh(context, applicationArguments);
- 现阶段为空实现
 
 
prepareContext 的主流程
1  | java复制代码// prepareContext(context, environment, listeners, applicationArguments, printedBanner);  | 
refresh 流程
1  | java复制代码  | 
afterRefresh 流程
PS : 这是一个空实现
1  | java复制代码M1_60- afterRefresh  | 
2.7 Listener 处理
Application 启动时 , Listener 总共涉及到四个操作 :
- getRunListeners
 - listener.starting
 - listener.started
 - listener.running
 
以我这微薄的英语水平 , 这里面怕是有个进行时和一个过去时 , 哈哈哈哈哈
可以看到 , 第一步和第四步目的都比较明确 , 主要来看看第二 . 三步
getRunListeners
1  | java复制代码C- SpringApplication  | 
listener.starting
1  | java复制代码//这里的 starting 是 EventPublishingRunListener 运行  | 
listeners.started(context)
1  | java复制代码// 这里的事件就更多了  | 
listener.running
1  | java复制代码// 发布 ReadyEvent  | 
篇幅有限 , 就不详细看看哪些执行了
2.8 其他处理
1  | java复制代码  | 
三 . 总结
这一篇对 SpringBoot 的大概流程简单过了一遍 , 篇幅有限有几个点暂时先没纳入 , 后续补充
- @SpringApplication 注解
 - SpringApplicationContext 的始末
 - Listener 的加载逻辑
 
更新记录
- v20210804 : 更新布局 , 优化结构
 
本文转载自: 掘金