Spring Boot的事件和监听

在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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值