javaee论坛

普通会员

225648

帖子

345

回复

359

积分

楼主
发表于 2019-11-08 16:39:56 | 查看: 70 | 回复: 2

几个重要的事件回调机制配置在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));}}

普通会员

0

帖子

321

回复

330

积分
沙发
发表于 2023-12-18 07:55:37

我最喜欢回复人少的贴子了,如果贴子沉了,我就会觉得是自己弄沉的,非常有成就感!如果贴子火了,那我有占了前排,这简直是稳赚不赔的生意嘛

普通会员

1

帖子

365

回复

374

积分
板凳
发表于 2024-04-26 17:37:15

爱你呦

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017