栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【闲聊杂谈】SpringBoot启动加载过程(基于2.2.2版本)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【闲聊杂谈】SpringBoot启动加载过程(基于2.2.2版本)

第〇步

① 判断当前应用程序的类型:NONE、SERVLET、REACTIVE 其中之一;

② 加载所有初始化容器;

③ 加载所有的监听器;

④ 找到程序运行的主类。

注:②、③ 通过 getSpringFactoriesInstances() 方法,根据传入的类名,得到需要的工厂集合的实例 -> 记载spring.factory文件中的内容 -> 获取文件中对应类的全路径 -> 根据反射得到具体的实体类对象 -> 生成对应的对象之后再返回给调用者。

第一步

开启计时器,StopWatch stopWatch = new StopWatch();

设置当前任务的ID和启动时间,方便后续的时候进行计时操作。

第二步

配置系统属性 java.awt.headless(意义不大,可以忽略)。

第三步

注册listeners:SpringApplicationRunListeners listeners = getRunListeners(args);

获取 EventPublishRunListeners 对象,此对象会贯穿整个应用程序启动的过程,每次在进行监听器操作的时候,都会从中获取具体的监听器。每次监听器在实际做操作的时候都会执行 listeners.*() -> this.initialMulticaster.multicastEvent -> 匹配不同类型的事件,然后从所有的监听器中,把不符合条件的监听器给过滤掉 -> 符合条件的监听器会循环执行具体的自己的处理逻辑。

第四步

SimpleCommandLineArgsParser().parse(args);

加载命令行参数值,解析在命令行中通过 --key=value 输入的属性值,封装到 ApplicationArguments对象中

第五步

准备当前应用程序的环境:ConfigurableEnviroment enviroment = prepareEnviroment(listeners, applicationArguments);

获取或创建一个环境: getOrCreateEnvironment(),这一步是根据当前应用程序的类型来做判断;

对当前环境进行相关参数的配置:configureEnvironment()

listeners.enviromentPrepared(enviroment)

第六步

设置系统属性(spring.beaninfo.ignore),保证某些Bean不会添加到准备的环境中。

第七步

打印banner图:Banner printedBanner = printBanner(enviroment);

先判断是否有图片,仅支持jpg、gif、png格式的图片 -> 读取 banner.txt 文件中的内容 -> 循环打印出banner中的内容

第八步

准备上下文应用对象:context = createAoolicationContext();

根据当前应用程序的类型来判断创建什么格式的上下文对象。 此处在看到创建上下文的对象之后,一定要看类关系图,在父子关系中完成了很多初始化的操作,比较容易被忽略掉。

第九步

设置异常报告器对象: exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReport.class, new Class[] {ConfigurableApplicationContext.class}, context);

第十步

准备当前上下文对象。

设置初始化进行执行:applyInitializers(context) -> 向 beanFactory 中注入了三个 postprocessor 对象,后续在自动装配的时候后用到

listeners.contextPrepared(context);

加载很多资源配置,自动装配在此环节完成:load(context, sources.toArray(new Object[0]))

listeners.contextLoader(context)

第十一步

刷新上下文环境:refreshContext(context)

这是非常关键的一步操作,但是这属于Spring,而不是SpringBoot,后面有机会再介绍Spring的时候再详细的讲解一下。

第十二步

上下文对象准备好之后的操作(默认是什么都不做,方便扩展):afterRefresh(context, applicationArguments);

第十三步

计时结束,并打印启动程序运行的时长:stopWatch.stop();

第十四步

运行所有的监听器对象,进行最后的启动执行:listeners.started(context);

第十五步

listeners.runing(context);

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/439801.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号