几个重要的事件回调机制配置在META-INF/spring.factoriesApplicationContextInitializerSpringApplicationRunListener只需要放在ioc容器中ApplicationRunnerCommandLineRunner启动流程:
一、创建SpringApplication对象initialize(sources);privatevoidinitialize(Object[]sources){//保存主配置类if(sources!=null&&sources.length>0){this.sources.addAll(Arrays.asList(sources));}//判断当前是否一个web应用this.webEnvironment=deduceWebEnvironment();//从类路径下找到META-INF/spring.factories配置的所有ApplicationContextInitializer;然后保存起来setInitializers((Collection)getSpringFactoriesInstances(ApplicationContextInitializer.class));//从类路径下找到ETA-INF/spring.factories配置的所有ApplicationListenersetListeners((Collection)getSpringFactoriesInstances(ApplicationListener.class));//从多个配置类中找到有main方法的主配置类this.mainApplicationClass=deduceMainApplicationClass();}
二、运行run方法publicConfigurableApplicationContextrun(String...args){StopWatchstopWatch=newStopWatch();stopWatch.start();ConfigurableApplicationContextcontext=null;FailureAnalyzersanalyzers=null;configureHeadlessProperty();//获取SpringApplicationRunListeners;从类路径下META-INF/spring.factoriesSpringApplicationRunListenerslisteners=getRunListeners(args);//回调所有的SpringApplicationRunListener.starting()方法listeners.starting();try{//封装命令行参数ApplicationArgumentsapplicationArguments=newDefaultApplicationArguments(args);//准备环境ConfigurableEnvironmentenvironment=prepareEnvironment(listeners,applicationArguments);//创建环境完成后回调SpringApplicationRunListener.environmentPrepared();表示环境准备完成BannerprintedBanner=printBanner(environment);//创建ApplicationContext;决定创建web的ioc还是普通的ioccontext=createApplicationContext();analyzers=newFailureAnalyzers(context);//准备上下文环境;将environment保存到ioc中;而且applyInitializers();//applyInitializers():回调之前保存的所有的ApplicationContextInitializer的initialize方法//回调所有的SpringApplicationRunListener的contextPrepared();//prepareContext(context,environment,listeners,applicationArguments,printedBanner);//prepareContext运行完成以后回调所有的SpringApplicationRunListener的contextLoaded();//s刷新容器;ioc容器初始化(如果是web应用还会创建嵌入式的Tomcat);Spring注解版//扫描,创建,加载所有组件的地方;(配置类,组件,自动配置)refreshContext(context);//从ioc容器中获取所有的ApplicationRunner和CommandLineRunner进行回调//ApplicationRunner先回调,CommandLineRunner再回调afterRefresh(context,applicationArguments);//所有的SpringApplicationRunListener回调finished方法listeners.finished(context,null);stopWatch.stop();if(this.logStartupInfo){newStartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(),stopWatch);}//整个SpringBoot应用启动完成以后返回启动的ioc容器;returncontext;}catch(Throwableex){handleRunFailure(context,listeners,analyzers,ex);thrownewIllegalStateException(ex);}}三、事件监听机制
配置在META-INF/spring.factoriesApplicationContextInitializer
publicclassHelloApplicationContextInitializerimplementsApplicationContextInitializer<ConfigurableApplicationContext>{@Overridepublicvoidinitialize(ConfigurableApplicationContextapplicationContext){System.out.println("ApplicationContextInitializer...initialize..."+applicationContext);}}
SpringApplicationRunListener
publicclassHelloSpringApplicationRunListenerimplementsSpringApplicationRunListener{//必须有的构造器publicHelloSpringApplicationRunListener(SpringApplicationapplication,String[]args){}@Overridepublicvoidstarting(){System.out.println("SpringApplicationRunListener...starting...");}@OverridepublicvoidenvironmentPrepared(ConfigurableEnvironmentenvironment){Objecto=environment.getSystemProperties().get("os.name");System.out.println("SpringApplicationRunListener...environmentPrepared.."+o);}@OverridepublicvoidcontextPrepared(ConfigurableApplicationContextcontext){System.out.println("SpringApplicationRunListener...contextPrepared...");}@OverridepublicvoidcontextLoaded(ConfigurableApplicationContextcontext){System.out.println("SpringApplicationRunListener...contextLoaded...");}@Overridepublicvoidfinished(ConfigurableApplicationContextcontext,Throwableexception){System.out.println("SpringApplicationRunListener...finished...");}}
配置(META-INF/spring.factories)
org.springframework.context.ApplicationContextInitializer=\com.atguigu.springboot.listener.HelloApplicationContextInitializerorg.springframework.boot.SpringApplicationRunListener=\com.atguigu.springboot.listener.HelloSpringApplicationRunListener
只需要放在ioc容器中ApplicationRunner
@ComponentpublicclassHelloApplicationRunnerimplementsApplicationRunner{@Overridepublicvoidrun(ApplicationArgumentsargs)throwsException{System.out.println("ApplicationRunner...run....");}}
CommandLineRunner
@ComponentpublicclassHelloCommandLineRunnerimplementsCommandLineRunner{@Overridepublicvoidrun(String...args)throwsException{System.out.println("CommandLineRunner...run..."+Arrays.asList(args));}}