SpringBoot
【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】
SpringBoot 原理篇
文章目录
- SpringBoot
- SpringBoot 原理篇
- 3 核心原理
- 3.5 启动流程【4】【5】【6】
- 3.5.1 看源码咯
- 3.5.2 总结
3 核心原理
3.5 启动流程【4】【5】【6】
3.5.1 看源码咯
OK, 接着上次我们已经把
这个东西了解得差不多了
就是前面这一段,它初始化了SpringBoot 程序的启动的所有相关配置
接下来就是看后面的run 方法了,点进去
运行整个过程 → 初始化容器【但是过程没那么简单】
ConfigurableApplicationContext
这是run 方法的返回值
一行一行的来看
StopWatch stopWatch = new StopWatch();
计时器
就是这样来的【所以,之前的初始化操作都没有算到显示给我们看的那个时间中【假象】】
【设置了计时器】
stopWatch.start();
【计时器开始】
DefaultBootstrapContext bootstrapContext = this.createBootstrapContext();
【系统引导信息对应的上下文对象】
ConfigurableApplicationContext context = null;
【定义了一个对象】
this.configureHeadlessProperty();
【模拟输入输出信号,避免出现因缺少外设导致的信号传输失败,进而引发错误(模拟显示器、键盘、鼠标…)】
【java.awt.headless = true;】
SpringApplicationRunListeners listeners = this.getRunListeners(args);
【获取当前注册的可运行的监听器】
listeners.starting(bootstrapContext, this.mainApplicationClass);
【监听器执行了对应的操作步骤】
到这里其实还是一些准备性的工程,还没开始创建容器
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
【获取参数】
ConfigurableEnvironment environment = this.prepareEnvironment(listeners, bootstrapContext, applicationArguments);
【将前期读取的数据加载成了一个环境对象,用来描述信息】
this.configureIgnoreBeanInfo(environment);
【做了一个配置,备用】
Banner printedBanner = this.printBanner(environment);
【初始化启动图标】
context = this.createApplicationContext();
【创建容器对象,根据前期配置的容器类型进行判定并创建】
context.setApplicationStartup(this.applicationStartup);
【设置启动模式】
this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
【对容器进行设置,参数来源于前期的设定】
this.refreshContext(context);
【刷新容器环境】
this.afterRefresh(context, applicationArguments);
【刷新完毕后,做后处理】
stopWatch.stop();
【计时结束】
if (this.logStartupInfo) {
(new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);
}
【判定是否记录启动时间的日志】【创建日志对应的对象,输出日志信息,包含启动时间】
listeners.started(context);
【监听器执行了对应的操作步骤】
listeners.running(context);
【监听器执行了对应的操作步骤】
到这儿就结束了
OK, 回顾一下
- 初始化各种属性,加载成对象
- 读取环境属性(Environment)
- 系统配置(spring.factories)
- 参数(Arguments、application.properties)
- 创建Spring容器对象ApplicationContext,加载各种配置
- 在容器创建前,通过监听器机制,应对不同阶段加载数据、更新数据的需求
- 容器初始化过程中追加各种功能,例如统计时间、输出日志等
【两个阶段】
【监听器类型】
- 在应用运行但未进行任何处理时,将发送 ApplicationStartingEvent。
- 当Environment被使用,且上下文创建之前,将发送 ApplicationEnvironmentPreparedEvent。
- 在开始刷新之前,bean定义被加载之后发送 ApplicationPreparedEvent。
- 在上下文刷新之后且所有的应用和命令行运行器被调用之前发送 ApplicationStartedEvent。
- 在应用程序和命令行运行器被调用之后,将发出 ApplicationReadyEvent,用于通知应用已经准备处理请求。
- 启动时发生异常,将发送 ApplicationFailedEvent
3.5.2 总结
- 理解过程有助于思考
李老师牛逼!!!!!!!!!!!!!!!!!!!!!【微服务我来啦!】