官网对springboot事件的描述
springboot中事件的发布顺序(发送优先级从高到底)
ApplicationStartingEvent
在运行开始时发送 ,但在进行任何处理之前(侦听器和初始化程序的注册除外)发送ApplicationEnvironmentPreparedEvent
当被发送Environment到中已知的上下文中使用,但是在创建上下文之前ApplicationContextInitializedEvent
在ApplicationContext
准备好且已调用ApplicationContextInitializers
之后但任何bean定义未加载之前发送ApplicationPreparedEvent
在刷新开始之前但在加载bean定义之后发送ApplicationStartedEvent
上下文已被刷新后发送,但是任何应用程序和命令行亚军都被调用前ApplicationReadyEvent
在所有的命令行应用启动后发送此事件,可以处理请求ps:这里的命令行引用主要是指扩展了
ApplicationRunner
和CommandLineRunner
的实现ApplicationFailedEvent
如果在启动时异常发送
自定义扩展事件或监听springboot事件方法
前提:需要等待ApplicationContext已经初始化完成才能通过其发送事件
- 自定义事件
/**
* @Author xf
* @Description 事件(消息)
* @Date 2019/12/6 16:41
**/
public class MessageEvent extends ApplicationEvent {
public MessageEvent(Object source) {
super(source);
}
}
- 自定义监听器
- 实现方式1:通过
@EventListener
指定需要监听的事件,常用/** * @Author xf * @Description 事件监听 * @Date 2019/12/6 16:42 **/ @Component public class MyListener { @EventListener(value = MessageEvent.class) public void listener(Object object){ System.out.println("MyListener = " + object); } }
- 实现方式2:通过实现EventListener
/** * @Author xf * @Description 刷新事件监听 * @Date 2019/12/6 17:05 **/ @Component public class RefreshEventListener implements ApplicationListener { @Override public void onApplicationEvent(ApplicationEvent applicationEvent) { if(applicationEvent instanceof MessageEvent){ final MessageEvent messageEvent = (MessageEvent) applicationEvent; System.out.println("(RefreshEventListener ) = " + messageEvent); } } }
- 通过spring.factories方法扩展,这个方法不太合适用在这里,可读性不高,与上一个实现方式的区别就是去掉了注解
@Component
。放在spring.factories内让spring进行初始化.spring在初始化所有扩展spring.factories的内容时一并初始化。这种方式是自定义spring-boot-starter-xxx.jar的时候常用的方法。
添加META-INF文件夹,并新建public class SpringFactoriesEventListener implements ApplicationListener { @Override public void onApplicationEvent(ApplicationEvent applicationEvent) { if(applicationEvent instanceof MessageEvent){ final MessageEvent messageEvent = (MessageEvent) applicationEvent; System.out.println("(SpringFactoriesEventListener ) = " + messageEvent); } } }
spring.factories
文件,添加如下内容org.springframework.context.ApplicationListener=com.xfc.transactional.transactional.listener.SpringFactoriesEventListener
- 实现方式1:通过
最后看一下运行结果
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.2.1.RELEASE)
2019-12-06 18:12:36.212 INFO 620792 --- [ main] c.x.t.t.TransactionalApplication : Starting TransactionalApplication on chenxingfei with PID 620792 (D:\personal-workspace\transactional\target\classes started by mintq in D:\personal-workspace\transactional)
2019-12-06 18:12:36.218 INFO 620792 --- [ main] c.x.t.t.TransactionalApplication : No active profile set, falling back to default profiles: default
2019-12-06 18:12:39.730 INFO 620792 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2019-12-06 18:12:39.759 INFO 620792 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2019-12-06 18:12:39.760 INFO 620792 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.27]
2019-12-06 18:12:39.972 INFO 620792 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2019-12-06 18:12:39.972 INFO 620792 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 3484 ms
2019-12-06 18:12:40.987 INFO 620792 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2019-12-06 18:12:41.748 INFO 620792 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2019-12-06 18:12:41.757 INFO 620792 --- [ main] c.x.t.t.TransactionalApplication : Started TransactionalApplication in 7.269 seconds (JVM running for 8.432)
(MyListener) = com.xfc.transactional.transactional.event.MessageEvent[source=我发布事件了]
(SpringFactoriesEventListener) = com.xfc.transactional.transactional.event.MessageEvent[source=我发布事件了]
(RefreshEventListener) = com.xfc.transactional.transactional.event.MessageEvent[source=我发布事件了]
欢迎交流哦!!!私信我