SpringBoot启动流程分析(二):SpringApplication的run方法

  Spring IoC容器与应用上下文的设计与实现

SpringBoot启动流程源码分析:

SpringBoot启动流程分析(一):SpringApplication类初始化过程

SpringBoot启动流程分析(二):SpringApplication的run方法

SpringBoot启动流程分析(三):SpringApplication的run方法之prepareContext()方法

SpringBoot启动流程分析(四):IoC容器的初始化过程

SpringBoot启动流程分析(五):SpringBoot自动装配原理实现

SpringBoot启动流程分析(六):IoC容器依赖注入

笔者注释版Spring Framework与SpringBoot源码git传送门:请不要吝啬小星星

spring-framework-5.0.8.RELEASE

SpringBoot-2.0.4.RELEASE

一、前言

  前一篇博客介绍了 SpringApplication 类的实例化过程,本章总结SpringBoot启动流程最重要的部分run方法。通过rrun方法梳理出SpringBoot启动的流程,然后后面的博客再一步步的分析启动流程中各个步骤所做的具体的工作。深入分析后会发现SpringBoot也就是给Spring包了一层皮,事先替我们准备好Spring所需要的环境及一些基础,具体通过源码一步步深入分析后会发现Spring是真的很伟大。当然跟代码的时候越深入越容易陷进去进而发现有些东西没法通过博客详细的梳理出来。当然在这个过程中还是立足于我们对SpringBoot的使用来说明源码所做的工作。知其然才能知其所以然。加油

 

二、SpringBoot启动流程梳理

  首先摆上run方法的源码

1 /** 2 * Run the Spring application, creating and refreshing a new 3 * {@link ApplicationContext}. 4 * 5 * @param args the application arguments (usually passed from a Java main method) 6 * @return a running {@link ApplicationContext} 7 * 8 * 运行spring应用,并刷新一个新的 ApplicationContext(Spring的上下文) 9 * ConfigurableApplicationContext 是 ApplicationContext 接口的子接口。在 ApplicationContext 10 * 基础上增加了配置上下文的工具。 ConfigurableApplicationContext是容器的高级接口 11 */ 12 public ConfigurableApplicationContext run(String... args) { 13 //记录程序运行时间 14 StopWatch stopWatch = new StopWatch(); 15 stopWatch.start(); 16 // ConfigurableApplicationContext Spring 的上下文 17 ConfigurableApplicationContext context = null; 18 Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>(); 19 configureHeadlessProperty(); 20 //从META-INF/spring.factories中获取监听器 21 //1、获取并启动监听器 22 SpringApplicationRunListeners listeners = getRunListeners(args); 23 listeners.starting(); 24 try { 25 ApplicationArguments applicationArguments = new DefaultApplicationArguments( 26 args); 27 //2、构造应用上下文环境 28 ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments); 29 //处理需要忽略的Bean 30 configureIgnoreBeanInfo(environment); 31 //打印banner 32 Banner printedBanner = printBanner(environment); 33 ///3、初始化应用上下文 34 context = createApplicationContext(); 35 //实例化SpringBootExceptionReporter.class,用来支持报告关于启动的错误 36 exceptionReporters = getSpringFactoriesInstances( 37 SpringBootExceptionReporter.class, 38 new Class[]{ConfigurableApplicationContext.class}, context); 39 //4、刷新应用上下文前的准备阶段 40 prepareContext(context, environment, listeners, applicationArguments, printedBanner); 41 //5、刷新应用上下文 42 refreshContext(context); 43 //刷新应用上下文后的扩展接口 44 afterRefresh(context, applicationArguments); 45 //时间记录停止 46 stopWatch.stop(); 47 if (this.logStartupInfo) { 48 new StartupInfoLogger(this.mainApplicationClass) 49 .logStarted(getApplicationLog(), stopWatch); 50 } 51 //发布容器启动完成事件 52 listeners.started(context); 53 callRunners(context, applicationArguments); 54 } catch (Throwable ex) { 55 handleRunFailure(context, ex, exceptionReporters, listeners); 56 throw new IllegalStateException(ex); 57 } 58 59 try { 60 listeners.running(context); 61 } catch (Throwable ex) { 62 handleRunFailure(context, ex, exceptionReporters, null); 63 throw new IllegalStateException(ex); 64 } 65 return context; 66 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyppp.html