一、使用步骤
- 创建继承ApplicationEvent的事件对象
public class CustomEvent extends ApplicationEvent
{
public CustomEvent(Object source) {
super(source);
}
}
- 创建监听器对象,用@EventListener注解标注处理方法
@Component
public class CustomEventListener {
@EventListener(value = CustomEvent.class)
public void handle(CustomEvent event) {
System.out.println("处理事件");
}
}
- 抛出事件
@SpringBootTest
public class EventTest implements ApplicationContextAware{
ApplicationContext applicationContext;
@Test
public void test() {
//抛出事件
applicationContext.publishEvent(new CustomEvent("123"));
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext=applicationContext;
}
}
二、原理
-
必要的组件
- ApplicationEvent:代表事件对象
- @EventListener:标注在方法上,用于处理事件
- EventListenerFactory:用于创建ApplicationListener对象,默认实现DefaultEventListenerFactory
- EventListenerMethodProcessor:实现了SmartInitializingSingleton接口;从容器中获取所有的@EventListener标注的方法,并用从容器中获取的EventListenerFactory对象创建ApplicationListener对象,并将其放入Context中。
-
EventListenerFactory 和 EventListenerMethodProcessor注入流程
三、增强事件处理
如何增强:第一步,继承@EventListener,第二步,实现EventListenerFactory;常见的如事务事件处理。
- 事务事件处理:可以在事务的各个阶段调用监听处理,常见的情况是在事务结束后进行一些处理操作。核心组件是TransactionalEventListenerFactory和@TransactionalEventListener;