SpringBoot(三十一)@EventListener

401 阅读2分钟

在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注解的基本使用。

 

有好的建议,请在下方输入你的评论。