在ApplicationContext创建之前会触发一些事件,因此您无法将其注册为的侦听器@Bean。您可以通过SpringApplication.addListeners(…)或SpringApplicationBuilder.listeners(…) 方法注册它们 。
如果您希望这些侦听器自动注册,而不管创建应用程序的方式如何,则可以将META-INF/spring.factories文件添加到项目中,并使用org.springframework.context.ApplicationListener 键引用侦听器。
应用程序事件在您的应用程序运行时按以下顺序发送:
ApplicationStartedEvent:在运行开始时发送,但在进行任何处理(侦听器和初始化程序的注册除外)之前都会发送。
ApplicationEnvironmentPreparedEvent:当Environment被发送到在上下文已经知道被使用,但是在创建上下文之前。
ApplicationPreparedEvent:在刷新开始之前但在Bean定义加载之后发送。
ApplicationReadyEvent:被刷新后发送和任何相关的回调已被处理,表示该应用程序已准备好服务请求。
ApplicationFailedEvent:如果在启动时异常发送。
比如要创建一个在应用运行开始时的监听事件:
packagecom.xing.studyboot.listener; importorg.springframework.boot.context.event.ApplicationStartedEvent; importorg.springframework.context.ApplicationListener; importorg.springframework.stereotype.Component; /*** ApplicationStartedEvent 监听器 * @author xing* @createTime*/publicclassApplicationStartedEventListenerimplementsApplicationListener<ApplicationStartedEvent> { publicvoidonApplicationEvent(ApplicationStartedEventevent) { System.out.println("ApplicationStartedEventListener->"+event); } }
上述代码 @Component 存在时,其实已经注册到了应用里,无需进行下一步,但是如果不用这个注解的话,可以在启动类中加入如下代码:
SpringApplicationspringApplication=newSpringApplication(StudybootApplication.class); springApplication.setBanner(newMyBanner());//设置启动banner// 添加启动时事件监听器 建议采用 @Component注解实现springApplication.addListeners( newApplicationStartedEventListener(), newApplicationContextRefreshedEventLister() ); springApplication.run(args);
启动应用后,控制台可以发现监听器已经捕捉到了事件:
总结:
Spring官网也说:您通常不需要使用应用程序的事件,但是知道它们的存在会很方便。在内部,Spring Boot使用事件来处理各种任务。
嗯,这就是ApplicationContext创建或者报错时各种监听。
ApplicationListener的实现类,蛮多的: