在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