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