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