几个重要的事件回调机制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