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

导读:本篇文章讲解 【闲聊杂谈】SpringBoot启动加载过程(基于2.2.2版本),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

第〇步

① 判断当前应用程序的类型: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);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/111937.html

(0)
Java光头强的头像Java光头强

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!