Spring Boot的事件和监听

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/c910511/article/details/82994953

在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

猜你喜欢

转载自blog.csdn.net/c910511/article/details/82994953