当前位置: 首页 > news >正文

Spring @OnApplicationEvent 典型用法

典型用法

监听自定义事件

// 定义事件类
public class UserRegisteredEvent extends ApplicationEvent {private final String username;public UserRegisteredEvent(Object source, String username) {super(source);this.username = username;}public String getUsername() {return username;}
}// 发布事件
@Service
public class UserService {@Autowiredprivate ApplicationEventPublisher eventPublisher;public void registerUser(String username) {System.out.println("用户注册:" + username);eventPublisher.publishEvent(new UserRegisteredEvent(this, username));}
}// 监听事件
@Component
public class UserRegistrationListener {@OnApplicationEventpublic void onUserRegistered(UserRegisteredEvent event) {System.out.println("监听到用户注册事件:" + event.getUsername());}
}

监听内置 Spring 应用事件

Spring 内置了一些标准事件,可以直接使用 @OnApplicationEvent 进行监听。

// 监听应用启动完成事件
@Component
public class StartupEventListener {@OnApplicationEventpublic void onApplicationReady(ApplicationReadyEvent event) {System.out.println("应用已启动完成");}
}

异步处理事件(结合 @Async)

默认情况下,事件监听是同步执行的。若希望异步处理,可结合 @Async 注解。

@Component
public class AsyncEventListener {@OnApplicationEvent@Asyncpublic void handleUserRegistered(UserRegisteredEvent event) {System.out.println("【异步】收到用户注册事件:" + event.getUsername());}
}

条件过滤事件(SpEL 表达式)

可以使用 condition 属性进行条件判断,仅当满足条件时才执行监听方法。

@Component
public class ConditionalEventListener {@OnApplicationEvent(condition = "#event.username.startsWith('admin')")public void onAdminUserRegistered(UserRegisteredEvent event) {System.out.println("管理员用户注册:" + event.getUsername());}
}

多事件监听(泛型支持)

一个监听方法可以监听多个事件类型,只需将参数声明为它们的共同父类或接口。

@Component
public class MultiEventLogger {@OnApplicationEventpublic void logEvent(ApplicationEvent event) {System.out.println("监听到事件:" + event.getClass().getSimpleName());}
}
http://www.lryc.cn/news/571450.html

相关文章:

  • MacOS15.5 MySQL8 开启 mysql_native_password
  • 【入门级-基础知识与编程环境:计算机的历史和常见用途】
  • 【RocketMQ 生产者和消费者】- 消费者重平衡(2)- 分配策略
  • 338比特位技术
  • element ui el-table嵌套el-table,实现checkbox联动效果
  • 轻松搭建Linux开发环境:使用`build-essential`安装GCC编译器**
  • Flask设计网页截屏远程电脑桌面及切换运行程序界面
  • 软件体系结构-论述、设计、问答
  • C++---类和对象(中)
  • BERT介绍
  • 失业学习-前端工程化-webpack基础
  • 智慧城市-城市道路塌方检测数据集VOC+YOLO格式768张1类别
  • 微軟將開始使用 Copilot Vision 監控 Windows 10 和 11 用戶的螢幕
  • 视频点播web端AI智能大纲(自动生成视频内容大纲)的代码与演示
  • 【matlab】图片转视频
  • 【PDF提取表格】批量提取PDF里的内容保存到Excel表格,批量提取PDF文档中的信息到Excel的具体步骤和注意事项
  • FPGA基础 -- Verilog门级建模之奇偶校验电路
  • ollama部署开源大模型
  • VS和VS Code 对比和区别
  • 【图像处理入门】9. 基础项目实战:从去噪到图像加密
  • 计算机视觉课程笔记-机器学习中典型的有监督与无监督学习方法的详细分类、标签空间性质、解释说明,并以表格形式进行总结
  • 论文笔记 <交通灯> IntelliLight:一种用于智能交通灯控制的强化学习方法
  • 2025年- H82-Lc190--322.零钱兑换(动态规划)--Java版
  • 海康威视GigE工业相机的python调用demo
  • 2.8 获取IMU数据与航向锁定
  • Kafka 4.0.0集群部署
  • 二十四、【用户管理与权限 - 篇六】前端动态展现:基于权限的菜单与按钮控制
  • Leetcode-​2537. 统计好子数组的数目​
  • SALMONN-omni论文阅读
  • Datawhale YOLO Master 第1次笔记