Spring Boot的事件和监听

xiaoxiao2021-04-17  114

在Spring Boot的框架中,处理一些通用的Spring框架的事件(如ContextRefreshedEvent),在SpringApplication中也会发送一下其他的应用的事件,下面来聊聊这些事件的触发时间和用法。

在程序的启动中,会有以下的事件触发【在2.0版本中所有的事件按执行的先后顺序如下】

1、ApplicationStartingEvent:开始启动,但在除了注册监听器和初始化程序之外的任何处理之前。

2、ApplicationEnvironmentPreparedEvent:spring boot 对应Enviroment已经准备完毕,但此时上下文context还没有创建。

3、ApplicationPreparedEvent:spring boot上下文context创建完成,但此时spring中的bean是没有完全加载完成的。

4、ApplicationStartedEvent:在上下文创建之后但在任何应用程序和命令行参数被调用之前发送

5、ApplicationReadyEvent:所有都准备完成

6、ApplicationFailedEvent:spring boot启动异常时执行事件

 

由于有一些事件会在ApplicationContext之前就创建了,所已不能使用@Bean来注册事件。事件的注册有以下两种方法:

1、使用SpringApplication.addListeners(…​)或者SpringApplicationBuilder.listeners(…​)注册

2、添加一个META-INF/spring.factories文件,然后在了按照以下格式添加要注册的事件:org.springframework.context.ApplicationListener=com.example.project.MyListener

 

下面来看事件DEMO代码

项目的整体结构:

1、MyApplicationEnvironmentPreparedEvent.java public class MyApplicationEnvironmentPreparedEvent implements ApplicationListener<ApplicationEnvironmentPreparedEvent> { private Logger LOGGER = LoggerFactory.getLogger(this.getClass()); @Override public void onApplicationEvent(ApplicationEnvironmentPreparedEvent applicationEnvironmentPreparedEvent) { LOGGER.info("ApplicationEnvironmentPreparedEvent..."); } } 2、MyApplicationFailedEvent.java public class MyApplicationFailedEvent implements ApplicationListener<ApplicationFailedEvent> { private Logger LOGGER = LoggerFactory.getLogger(this.getClass()); @Override public void onApplicationEvent(ApplicationFailedEvent applicationFailedEvent) { LOGGER.info("ApplicationFailedEvent..."); } } 3、MyApplicationPreparedEvent .java public class MyApplicationPreparedEvent implements ApplicationListener<ApplicationPreparedEvent> { private Logger LOGGER = LoggerFactory.getLogger(this.getClass()); @Override public void onApplicationEvent(ApplicationPreparedEvent applicationPreparedEvent) { LOGGER.info("ApplicationPreparedEvent..."); } } 4、MyApplicationReadyEvent .java public class MyApplicationReadyEvent implements ApplicationListener<ApplicationReadyEvent> { private Logger LOGGER = LoggerFactory.getLogger(this.getClass()); @Override public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) { LOGGER.info("ApplicationReadyEvent..."); } } 5、MyApplicationStartedEvent .java public class MyApplicationStartedEvent implements ApplicationListener<ApplicationStartedEvent> { private Logger LOGGER = LoggerFactory.getLogger(this.getClass()); @Override public void onApplicationEvent(ApplicationStartedEvent applicationStartedEvent) { LOGGER.info("ApplicationStartedEvent..."); } } 6、MyApplicationStartingEvent .java public class MyApplicationStartingEvent implements ApplicationListener<ApplicationStartingEvent> { private Logger LOGGER = LoggerFactory.getLogger(this.getClass()); @Override public void onApplicationEvent(ApplicationStartingEvent applicationStartingEvent) { LOGGER.info("ApplicationStartingEvent..."); } } 7、StartUpRunner.java @Component public class StartUpRunner implements CommandLineRunner { private Logger LOGGER = LoggerFactory.getLogger(this.getClass()); @Override public void run(String... strings) throws Exception { LOGGER.info("StartUPRunner ...."); } }

//方法1:使用SpringApplication.addListeners(…​),则其Application .java文件为【此时不用spring.factories文件】

7、Application .java @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication springBootApplication = new SpringApplication(Application.class); springBootApplication.addListeners(new MyApplicationEnvironmentPreparedEvent()); springBootApplication.addListeners(new MyApplicationFailedEvent()); springBootApplication.addListeners(new MyApplicationPreparedEvent()); springBootApplication.addListeners(new MyApplicationReadyEvent()); springBootApplication.addListeners(new MyApplicationStartedEvent()); springBootApplication.addListeners(new MyApplicationStartingEvent()); springBootApplication.run(args); } }

方法2:添加一个META-INF/spring.factories文件注册

,则其Application .java文件为

7、Application .java @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication springBootApplication = new SpringApplication(Application.class); springBootApplication.run(args); } }

spring.factories文件为:

org.springframework.context.ApplicationListener=com.example.demo.MyApplicationEnvironmentPreparedEvent\

,com.example.demo.MyApplicationFailedEvent\

,com.example.demo.MyApplicationPreparedEvent\

,com.example.demo.MyApplicationReadyEvent\

,com.example.demo.MyApplicationStartedEvent\

,com.example.demo.MyApplicationStartingEvent

 

运行后的结果为:

源码地址:https://github.com/cdy1263/SpringBootDemo/tree/master/Chapter_2_1

 

 

转载请注明原文地址: https://www.6miu.com/read-4819660.html

最新回复(0)