在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