SpringBoot启动过程 版本是2.4.5
底层还是用的spring应用,springboot 只是把一些我人工的配置,和功能场景,通过start包,讲一些配置问信息,提前装配好。
黄色标记的都是组件。我们可以实现组件,加入自己的逻辑。在启动过程中,springboot每完成一个重要的组件初始化,都要通知springboot 的监听器的。
1.创建SpringApplication(spring应用)
●保存一些信息。
●资源加载器 resourceLoader
● 比如获取主配置类并保存,获取到主配置类了,就可以回去类的注解,(@SpringBootApplication=》@EnableAutoConfiguration)后面就可以执行自动配置功能。
●当前应用的类型(Servlet)。通过 ClassUtils
●botstrappers: 初始启动引导器(List<Botstrappers>) :去spring.factories文件中找
■可以用来注册一些对象,这些对象可以用在从SpringBoot启动到Spring容器初始化完成的过程中
■org-springframework.boot. Bootstrapper
●找ApplicatinContextlnitializer;去spring.factories找 ApplicatinContextlnitializer
●用于在spring容器刷新之前初始化初始化Spring应用的 ConfigurableApplicationContext的回调接口 ,通常用于需要对应用程序上下文进行编程初始化的web应用程序中。例如,根据上下文环境注册属性源或激活配置文件等。
●List<ApplicationContetInitializer<?> > initializers
●找ApplicationListener ;应用监听器。去spring.factories找 ApplcationListener 是spring 应用的监听器,作用于整个Spring上下文,范围更广。
■List<ApplicationListener<?>> listeners
2.运行SpringApplication
●StopWatch
●记录应用的启动时间
●创建引导上下文(Context环境) createBootstrapContext()
●获取到所有之前的bootstrappers按个执行 Initializer]来完成对引导启动器上下文环境设置。让当前应用进入headless模式。java.awt.headless
●获取所有RunListener (运行监听器) [为 了方便所有Listener进行事件感知]
●getspringFactoriesInstances 去spring.factories找SpringApplicationRunListener 是在初始化SpringBoot应用时获取的是springBoot 的监听器。ApplicationListener的实现类会被SpringApplicationRunListener代理执行。
●遍历SpringApplicationRunListener调用starting方法:
●相当于通知所有感兴趣的人,springboot应用正在启动。
●保存命令行参数: ApplicationArguments
●准备环境prepareEnvironment () ;
■返回或者创建基础环境信息对象。StandardServletEnvironment
■当前会创建AnnotationConfigServletWebServerApplicationContext
3. 创建ApplicationContext I0C createApplicationContext
4. 准备ApplicationContext I0C容器的基本信息prepareContext0
■保存环境信息
■I0C容器的后置处理流程.
■应用初始化器; applylnitializers;
●遍历所有的ApplicationContextinitializer. 调用initialize.. 来对ioc容器进行初始化扩展功能
●遍历所有的listener调用contextPrepared. EventPublishRunListenr; 通知所有的监听器contextPrepared
■所有的监听器调用contextLoaded.通知所有的监听器contextLoaded;
5. 刷新IOC容器。refreshContext
■创建容器中的所有组件(Bean 的生命周期逻辑 )
。容器刷新完成后工作? afterRefresh
。所有监听器调用listeners started(context;通知所有的监听器started)
6. 调用所有runners; callRunners0 springBoot项目启动时候,有时候需要再启动之后直接执行某一段代码。这个时候就用到了 ApplicationRunner /CommandLineRunner 这个类。
■获取容器中的ApplicationRunner
■获取容器中的CommandLineRunner
■合并所有runner并且按照@Order进行排序
■遍历所有的runner.调用run方法
7.如果以上有异常
■调用Listener的failed
。调用所有监听器的running方法lsteners.unningicontext: 通知所有的监听器running
。running如果有问题。 继续通知filed。调用所有Listener的filed; 通知所有的监听器falled