幾個重要的事件回調機制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