首先分享之前的所有文章 , 欢迎点赞收藏转发三连下次一定 >>>> 😜😜😜
文章合集 : 🎁 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 : 更新布局 , 优化结构
本文转载自: 掘金