在Spring框架中,@EventListener注解用于标记一个方法,使其作为事件监听器,能够监听并处理Spring应用程序中发布的事件。
利用@EventListener,我们可以非常便捷的实现基于事件的通信机制,实现各组件之间的解耦。
在网上看到了许多关于@EventListener源码的分析,脑袋这个大,算了,先研究一下这玩意怎么用,深入理解和源码分析等以后再说叭。
一:简单用法
1:定义一个实体类
package com.modules.controller.test.Event;
import lombok.Data;
@Data
public class RegisterSuccessEvent
{
private String userName;
public RegisterSuccessEvent(String userName)
{
this.userName = userName;
System.out.println("类实例化成功!");
}
}
2:定义一个监听事件方法(监听实体类创建)
package com.modules.controller.test.Event;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class RegisterEventListener
{
@EventListener
public void handleNotifyEvent(RegisterSuccessEvent event) {
System.out.println("event:"+event);
log.info("监听到用户注册成功事件:" +
"{},测试成功", event.getUserName());
System.out.println("监听到用户注册成功事件:" + event.getUserName() +",测试成功");
}
}
3:测试一下:发布事件(实例化实体类)
/**
* 获取上下文对象
*/
@Resource
private ApplicationContext applicationContext;
@GetMapping("/publishEvent")
public void publishEvent()
{
// 发布事件 并创建对象
applicationContext.publishEvent(new RegisterSuccessEvent("camellia"));
}
浏览器访问:http://localhost:7001/java/publishEvent
控制台输出:
类实例化成功!
event:RegisterSuccessEvent(userName=camellia)
2024-09-03 11:18:38.613 INFO 28884 --- [nio-7001-exec-7] c.m.c.test.Event.RegisterEventListener : 监听到用户注册成功事件:camellia,测试成功
监听到用户注册成功事件:camellia,测试成功
二:@EventListener参数
@EventListener 注解有两个可选参数:classes 和 condition。
- classes 参数:用于指定要监听的事件类型。可以指定一个或多个事件类型,以数组形式传递。例如:
@EventListener(classes = {EventA.class, EventB.class})
public void handleEvent(Event event) {
// 处理事件逻辑
}
上述示例中,方法 handleEvent() 会监听 EventA 和 EventB 类型的事件。
- condition 参数:用于指定一个 SpEL 表达式作为条件,只有当条件满足时,才会执行监听器方法。例如:
@EventListener(condition = "#event.source == 'source'")
public void handleEvent(Event event) {
// 处理事件逻辑
}
上述示例中,方法 handleEvent() 只有当事件源为 source 时才会执行。
通过使用这两个参数,可以更加灵活地控制监听器的行为。可以根据具体需求选择要监听的事件类型,并根据条件来过滤需要处理的事件。
以上大概就是@EventListener注解的基本使用。
有好的建议,请在下方输入你的评论。