说明

此篇文章以 Spring 4.2+ 为例,在此版本之前略微有不同。 笔者自2014年起开始接触和使用 Spring event,根据 Spring event 的原理开发了 JFinal-event: gitee.com/596392912/J… ,方便 JFinal 用户使用,JFinal event 2.x 也同步成 Spring 4.2.x+ 的使用方式,不再需要创建多个 Listener 类,使用更加简单方便。

使用

创建 Event 事件监听

Spring 4.2+ 中不再需要单独编写监听器类,只需要在 Spring Bean 的方法上标记 @EventListener 注解即可。

示例:多个监听器,监听 Account 创建,完成不同的业务逻辑。

/*** 账号监听,处理账号创建成功的后续逻辑*/
@Component
public class AccountListener {/*** 1. 发送邮件、短信*/@EventListenerpublic void processAccountCreatedEvent1(AccountCreatedEvent event) {// TODO}/*** 2. 添加积分等,@Order(100) 用来设定执行顺序*/@EventListener@Order(100)public void processAccountCreatedEvent2(AccountCreatedEvent event) {// TODO}/*** 3. 创建 lucene 索引等,@Async 用来标记为异步线程池中执行*/@EventListener@Asyncpublic void processAccountCreatedEvent3(AccountCreatedEvent event) {// TODO}
}
复制代码

发送 Event 事件

示例:mybatis中发送账号创建事件。

注意:如果你是使用的 jpa,jpa 也有对应的事件机制,不需要像下面手动处理。

/*** 注入 ApplicationEventPublisher*/
@Autowired
private ApplicationEventPublisher publisher;@Override
public boolean save(Account account) {// 伪代码,数据库保存成功if (true) {publisher.publishEvent(new AccountCreatedEvent(account));}return false;
}
复制代码

idea 中的快捷跳转按钮

@EventListener 注解属性说明

@EventListener(value = {AccountCreatedEvent.class, AccountUpdatedEvent.class}, condition = "#event.account.age > 10")
public void processAccountCreatedEvent2(AccountEvent event) {// TODO
}
复制代码
  • valueclasses 作用相同,表示监听的一个或一组事件,用于支持方法中同一个父类的事件,例如 AccountEvent;
  • condition 表达式,支持 Spring el,用来做 event 中的变量或者方法判断。

监听执行顺序

可以使用 @Order(100) 注解来标记事件的监听执行顺序,异步的情况下只保证按顺序将监听器丢入进线程池,具体执行得看线程的心情 -.-

监听异步执行

使用 @Async 标记即可,注意前提条件是:使用 @EnableAsync 开启 Spring 异步。

Spring boot 配置异步

本节以 mica 中的异步配置为基础讲解。

异步配置

  • @EnableAsync 开启异步。
  • @EnableScheduling 开启定时任务。
  • MicaAsyncProperties 为异步线程池的配置。

异步配置项

配置项 默认值 说明
mica.async.core-pool-size 2 异步核心线程数,默认:2
mica.async.keep-alive-seconds 300 线程存活时间,默认:300
mica.async.max-pool-size 50 异步最大线程数,默认:50
mica.async.queue-capacity 10000 队列容量,默认:10000

开源推荐

  • mica Spring boot 微服务核心组件集:gitee.com/596392912/m…
  • Avue 一款基于vue可配置化的神奇框架:gitee.com/smallweigit…
  • pig 宇宙最强微服务(架构师必备):gitee.com/log4j/pig
  • SpringBlade 完整的线上解决方案(企业开发必备):gitee.com/smallc/Spri…
  • IJPay 支付SDK让支付触手可及:gitee.com/javen205/IJ…

关注我们

扫描上面二维码,更多精彩内容每天推荐!

转载于:https://juejin.im/post/5cac613ae51d456e7349dbca

Spring event 使用完全指南相关推荐

  1. Spring Event事件发布机制

    使用Spring Event优雅实现业务需求. 文章目录 一. 什么是Spring Event 二. 为什么要用Spring Event 三. 使用Spring Event实现邮件发送 一. 什么是S ...

  2. Spring Cloud Alibaba迁移指南(二):零代码替换 Eureka

    为什么80%的码农都做不了架构师?>>>    自 Spring Cloud 官方宣布 Spring Cloud Netflix 进入维护状态后,我们开始制作<Spring C ...

  3. 强烈推荐Spring Web Flow权威指南

    关于Spring Web Flow权威指南 评论 读后感:这是Spring Web Flow创始人写的书.内容是基于1.0的.此书原版出版时其实2.0已经推出了,为什么老大并没有追新呢?我猜想,书中写 ...

  4. EventBus VS Spring Event

    EventBus VS Spring Event 本地异步处理,采用事件机制 可以使 代码解耦,更易读.事件机制实现模式是 观察者模式(或发布订阅模式),主要分为三部分:发布者.监听者.事件. Gua ...

  5. 找找 Spring Event 源码中各种设计模式的使用

    为什么80%的码农都做不了架构师?>>>    本文将按照Spring Event 是什么鬼的思路寻找 Spring 源码中与 Spring Event 有关的设计模式实现 初始化- ...

  6. Spring Cloud Alibaba迁移指南(四):零代码兼容 Api-Gateway

    自 Spring Cloud 官方宣布 Spring Cloud Netflix 进入维护状态后,我们开始制作<Spring Cloud Alibaba迁移指南>系列文章,向开发者提供更多 ...

  7. Spring Cloud Alibaba迁移指南(四):零代码兼容 Api-Gateway 1

    自 Spring Cloud 官方宣布 Spring Cloud Netflix 进入维护状态后,我们开始制作<Spring Cloud Alibaba迁移指南>系列文章,向开发者提供更多 ...

  8. Spring Cloud Alibaba迁移指南(三):极简的 Config

    自 Spring Cloud 官方宣布 Spring Cloud Netflix 进入维护状态后,我们开始制作<Spring Cloud Alibaba迁移指南>系列文章,向开发者提供更多 ...

  9. Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel

    自 Spring Cloud 官方宣布 Spring Cloud Netflix 进入维护状态后,我们开始制作<Spring Cloud Alibaba迁移指南>系列文章,向开发者提供更多 ...

最新文章

  1. Windows下的DNS命令用法
  2. 可以由指令直接指定的I/O端口数(一共256个,从0到255一共256个端口号)
  3. Java实现ANN神经网络之BP代码参考
  4. jQuery 表格插件
  5. php设计分布图,MySQL分表实现上百万上千万记录分布存储的批量查询设计模式[图]_MySQL...
  6. 不同页面之间实现参数传递的几种方式
  7. RocketMQ核心概念
  8. 吴恩达深度学习——2.3 logistic回归损失函数
  9. 20-10-023-安装-KyLin-2.5.2-单机版安装(MAC)成功
  10. 一文带你认清数据仓库“维度模型设计”与“分层架构” | 原力计划
  11. UART通信协议(三)GPIO模拟串口
  12. ES6的Set()方法实现数组去重
  13. 黑苹果使用Hackintool注入声卡驱动
  14. 嵌入式系统开发-麦子学院(2)——开发环境的搭建
  15. 【SQL】数据库模糊查询
  16. 台式机机箱前置面板音频无效(win10系统)
  17. 消息栏通知(Notification)介绍
  18. Inline Hook 钩子编写技巧
  19. 初学python者自学anaconda的正确姿势是什么?
  20. linux 重新运行命令,如何在Linux中重新运行最后执行的命令?

热门文章

  1. 小工匠聊架构 - 分布式缓存技术
  2. MySQL - 无索引行锁升级为表锁
  3. Spring-AOP @AspectJ切点函数之execution()
  4. Git-将已有的项目转换为GIT项目托管到 GITHUB 仓库
  5. 武大计算机宿舍,国内最“豪华”的4所大学宿舍,武大上榜,最后一所意想不到!...
  6. php 会议签到系统_人脸识别会议签到系统有哪些优点?
  7. 使用多线程一定提高效率吗?
  8. (一) 自带刷新的列表-LtRecyclerView v2.x版本(LtAdapter)(基本使用)
  9. mysql如何实现读提交锁_MySQL学习笔记(二)—MySQL事务及锁详解
  10. 怎样在线把别人web前端代码抓下_自学web前端8个月,我是怎样拿下7K薪资的?