前言
在Spring Boot深入原理 - SpringApplication启动原理,我们概括性的介绍了SpringApplication的启动流程。
看过的同学一定知道,第一步就是初始化监听器并触发ApplicationStartedEvent事件。本文就从SpringApplication的第一步开始,深入聊聊Spring Boot的事件和监听器。
1. 什么是事件监听器
事件监听器包括3个部分,事件、事件源、事件监听器。
事件,主要用于传递参数,例如用户登录,可以传递用户的名字等参数。
事件源,就是触发监听的方法或事件,用于抛出一个事件,通知事件监听器。
事件监听器,监听某个事件,接收到这个事件后,处理相应的逻辑。
2. 监听器的处理流程
- 给事件注册监听
- 触发某个事件
- 触发的事件通知对应的监听器,传递事件参数
- 事件监听器处理对应的逻辑
3. SpringBoot事件 + 事件监听器
SpringBoot中的事件监听器可以监听springboot的启动过程,开发者可以在SpringBoot启动的这个过程中添加自己的应用功能。也可以用来bean之间的通信,例如一个bean加载完成通知监听器来完成自己的逻辑功能。
SpringBoot中事件和事件监听器的父类分别是:ApplicationEvent和ApplicationListener。
注:有一些事件是在创建ApplicationContext之前触发的,所以在注册这些事件时不能使用@Bean。你可以通过SpringApplication.addListeners或SpringApplicationBuilder.listeners方法注册。
如果你想自动注册这些监听,而不管如何创建应用。你可以添加一个META-INF/spring.factories文件,使用org.springframework.contentext.ApplicationListener引用你的Listener。如:
org.springframework.context.ApplicationListener=com.example.project.MyListener
ApplicationStartingEvent:SpringBoot框架开始启动的事件。
ApplicationStartedEvent:SpringBoot框架启动完成,context和bean都已创建完毕。
ApplicationEnvironmentPreparedEvent:SpringBoot框架环境准备完毕,context还没有创建完成,bean也没有完成创建。
ApplicationPreparedEvent:SpringBoot框架启动,context创建完,bean没有创建。
ApplicationFailedEvent:SpringBoot框架启动失败。
4. 创建自己的时间监听器
1、实现ApplicationListener接口,实现onApplicationEvent方法,方法参数即为该事件监听器监听的事件。
2、将时间监听器添加到SpringApplication实例中
context.addListeners(new MyApplicationListener());
3、启动springboot应用程序,查看监听器监听事件的结果:
5. 基于SpringBoot和注解实现优雅的事件监听器
- 定义事件
IEvent
事件的抽象接口,用于传递事件参数
1 | public interface IEvent { |
- 定义事件监听处理器
IEventListener
事件触发监听后,处理对应的逻辑
1 | public interface IEventListener { |
- 定义
@Listener
和@EventAnno
用于自动注册事件
1 | @Retention(RetentionPolicy.RUNTIME) |
1 | @Retention(RetentionPolicy.RUNTIME) |
- 定义监听方法处理器
EventMethodListener
用反射调用触发的监听方法
1 | public class EventMethodListener implements IEventListener { |
- 定义事件处理中心,统一处理事件的注册,事件触发后通知事件监听器。
1 | Component |
- 定义一个测试事件
1 | public class TestEvent implements IEvent { |
- 定义用于处理监听事件的Listener
1 | @Listener |
- 最后启动类,抛出对应的事件
1 | @SpringBootApplication |