SpringApplication: |
| private void initialize(Object[] sources) { |
| if (sources != null && sources.length > 0) { |
| this.sources.addAll(Arrays.asList(sources)); |
| } |
| this.webEnvironment = deduceWebEnvironment(); |
| |
| // 从spring.factories里读取所有 ApplicationContextInitializer,并记入 SpringApplication |
| setInitializers((Collection) getSpringFactoriesInstances( |
| ApplicationContextInitializer.class)); |
| |
| // 从spring.factories里读取所有 ApplicationListener,并记入 SpringApplication |
| setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); |
| |
| this.mainApplicationClass = deduceMainApplicationClass(); |
| } |
| |
| public ConfigurableApplicationContext run(String... args) { |
| StopWatch stopWatch = new StopWatch(); |
| stopWatch.start(); |
| ConfigurableApplicationContext context = null; |
| FailureAnalyzers analyzers = null; |
| configureHeadlessProperty(); |
| |
| // 从spring.factories里读取所有 SpringApplicationRunListener,监听springboot启动,参考:org.springframework.boot.context.event.EventPublishingRunListener |
| SpringApplicationRunListeners listeners = getRunListeners(args); |
| listeners.starting(); |
| try { |
| ApplicationArguments applicationArguments = new DefaultApplicationArguments( |
| args); |
| ConfigurableEnvironment environment = prepareEnvironment(listeners, |
| applicationArguments); |
| Banner printedBanner = printBanner(environment); |
| |
| // web环境下默认的 ApplicationContext: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext |
| // 非web环境下默认的 ApplicationContext: org.springframework.context.annotation.AnnotationConfigApplicationContext |
| context = createApplicationContext(); |
| analyzers = new FailureAnalyzers(context); |
| |
| // org.springframework.cloud.bootstrap.config.PropertySourceBootstrapProperties 会通过 ApplicationContextInitializer,准备 PropertySource |
| // PropertySourceBootstrapProperties 收集 PropertySourceLocator 来获得PropertySource |
| // 其中 org.springframework.cloud.config.client.ConfigServicePropertySourceLocator 是 Cloud Config Client 提供的 PropertySourceLocator |
| prepareContext(context, environment, listeners, applicationArguments, |
| printedBanner); |
| |
| // 调用 context.refresh |
| refreshContext(context); |
| |
| |
| 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, analyzers, ex); |
| throw new IllegalStateException(ex); |
| } |
| } |