(七)SpringBoot啓動配置原理

幾個重要的事件回調機制web

配置在META-INF/spring.factoriesspring

ApplicationContextInitializertomcat

SpringApplicationRunListenerapp

 

只須要放在ioc容器中less

ApplicationRunnerthis

CommandLineRunnerspa

 

啓動流程命令行

1.建立SpringApplication對象code

 1 initialize(sources);
 2 private void initialize(Object[] sources) {
 3         //保存主配置類
 4         if (sources != null && sources.length > 0) {
 5         this.sources.addAll(Arrays.asList(sources));
 6     }
 7     //判斷當前是不是一個web應用
 8     this.webEnvironment = deduceWebEnvironment();
 9     //從類路徑下META-INF/spring.factories配置的全部ApplicationContextInitializer;而後保存起來
10     setInitializers((Collection)          getSpringFactoriesInstances(ApplicationContextInitializer.class));
11     //從類路徑下找到META-INF/spring.factories配置的全部ApplicationListener;
12     setListeners((Collection)     getSpringFactoriesInstances(ApplicationListener.class));
13     //從多個配置類中找到那個有main方法的主配置類
14     this.mainApplicationClass = deduceMainApplicationClass();
15 }

2.運行run方法對象

 1 public ConfigurableApplicationContext run(String... args) {
 2         StopWatch stopWatch = new StopWatch();
 3         stopWatch.start();
 4         ConfigurableApplicationContext context = null;
 5         FailureAnalyzers analyzers = null;
 6         configureHeadlessProperty();
 7 
 8         //獲取SpringApplicationRunListensers;從類路徑下META-INF/spring.factories
 9         SpringApplicationRunListeners listeners = getRunListeners(args);
10         //回調全部的獲取SpringApplicationRunListener.starting()方法
11         listeners.starting();
12         try {
13             //封裝命令行參數
14             ApplicationArguments applicationArguments = new DefaultApplicationArguments(
15                     args);
16             //準備環境
17             ConfigurableEnvironment environment = prepareEnvironment(listeners,
18                     applicationArguments);
19             //建立環境完成後回調SpringApplicationRunListenser.environmentPrepared();表示環境準備完成
20                                         
21 
22             Banner printedBanner = printBanner(environment);
23             //建立ApplicationContext;決定建立web的ioc仍是普通的ioc
24             context = createApplicationContext();
25             analyzers = new FailureAnalyzers(context);
26             //準備上下文環境;將environment保存到ioc中;並且applyInitializers();
27             //applyInitializers():回調以前保存的全部的ApplicationContextInitializer的initialize方法
28             //回調全部的SpringApplicationRunListener的contextPrepared();
29                         
30             prepareContext(context, environment, listeners, applicationArguments,
31                     printedBanner);
32             //prepareContext運行完成之後回調全部的SpringApplicationRunListener的contextLoaded();
33             //刷新容器;ioc容器初始化(若是是web應用還會建立嵌入式的tomcat);掃描,建立,加載全部組件的地方;(配置類,組件,自動配置)
34             refreshContext(context);
35             //從ioc容器中獲取全部的ApplicationRunner和CommandLineRunner進行回調
36             //ApplicationRunner先回調,CommandLineRunner再回調
37             afterRefresh(context, applicationArguments);
38             //全部的SpringApplicationRunListener回調finished方法
39             listeners.finished(context, null);
40             stopWatch.stop();
41             if (this.logStartupInfo) {
42                 new StartupInfoLogger(this.mainApplicationClass)
43                         .logStarted(getApplicationLog(), stopWatch);
44             }
45             //整個SpringBoot應用啓動完成之後返回啓動的ioc容器;
46             return context;
47         }
48         catch (Throwable ex) {
49             handleRunFailure(context, listeners, analyzers, ex);
50             throw new IllegalStateException(ex);
51         }
52     }

三、事件監聽機制

配置在META-INF/spring.factories

ApplicationContextInitializer

SpringApplicationRunListener

 

只須要放在ioc容器中

ApplicationRunner

CommandLineRunner

相關文章
相關標籤/搜索