Spring Boot启动流程简介说明
下文笔者讲述SpringBoot启动流程,如下所示
下文笔者将从源码的角度讲述SpringBoot的启动流程,如下所示
springBoot启动代码
@SpringBootApplication public class Application { public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); } }
代码说明
Annotation定义(@SpringBootApplication) 和类定义(SpringApplication.run) 从源码可看出 @SpringBootApplication相当于 @SpringBootConfiguration + @ComponentScan + @EnableAutoConfiguration 以上三个注解的功能: 注册bean到spring容器 他们使用不同的条件不同的方式来完成: @SpringBootConfiguration 通过与 @Bean 结合完成Bean的 JavaConfig 配置; @ComponentScan 通过范围扫描的方式,扫描特定注解注释的类,将其注册到Spring容器; @EnableAutoConfiguration 借助spring.factories 的配置 并结合@Condition条件 完成bean注册 当然SpringBoot中还可以使用 @Import注解将bean注册到Spring容器
Spring Boot启动流程
SpringApplication的实例化 推断应用类型是否是Web环境 设置初始化器(Initializer) 设置监听器(listener) 推断应用入口类(Main) SpringApplication.run方法 获取SpringApplicationRunListeners 准备配置环境ConfigurableEnvironment 创建ApplicationContext应用上下文 ApplicationContext前置处理 ApplicationContext刷新 ApplicationContext后置处理 完成了实例化,下面开始调用run方法 // 运行run方法 public ConfigurableApplicationContext run(String... args) { // 此类通常用于监控开发过程中的性能,而不是生产应用程序的一部分。 StopWatch stopWatch = new StopWatch(); stopWatch.start(); ConfigurableApplicationContext context = null; Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>(); // 设置java.awt.headless系统属性,默认为true // Headless模式是系统的一种配置模式。在该模式下,系统缺少了显示设备、键盘或鼠标。 configureHeadlessProperty(); // KEY 1 - 获取SpringApplicationRunListeners SpringApplicationRunListeners listeners = getRunListeners(args); // 通知监听者,开始启动 listeners.starting(); try { ApplicationArguments applicationArguments = new DefaultApplicationArguments( args); // KEY 2 - 根据SpringApplicationRunListeners以及参数来准备环境 ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments); configureIgnoreBeanInfo(environment); // 准备Banner打印器 - 就是启动Spring Boot的时候打印在console上的ASCII艺术字体 Banner printedBanner = printBanner(environment); // KEY 3 - 创建Spring上下文 context = createApplicationContext(); // 注册异常分析器 analyzers = new FailureAnalyzers(context); // KEY 4 - Spring上下文前置处理 prepareContext(context, environment, listeners, applicationArguments, printedBanner); // KEY 5 - Spring上下文刷新 refreshContext(context); // KEY 6 - Spring上下文后置处理 afterRefresh(context, applicationArguments); // 发出结束执行的事件 listeners.finished(context, null); stopWatch.stop(); if (this.logStartupInfo) { new StartupInfoLogger(this.mainApplicationClass) .logStarted(getApplicationLog(), stopWatch); } return context; } catch (Throwable ex) { handleRunFailure(context, listeners, exceptionReporters, ex); throw new IllegalStateException(ex); } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。