Spring event 使用完全指南
说明
此篇文章以 Spring 4.2+ 为例,在此版本之前略微有不同。
笔者自2014年起开始接触和使用 Spring event,根据 Spring event 的原理开发了 JFinal-event: https://gitee.com/596392912/JFinal-event ,方便 JFinal 用户使用,JFinal event 2.x 也同步成 Spring 4.2.x+ 的使用方式,不再需要创建多个 Listener 类,使用更加简单方便。
使用
创建 Event 事件监听
Spring 4.2+ 中不再需要单独编写监听器类,只需要在 Spring Bean 的方法上标记 @EventListener
注解即可。
示例:多个监听器,监听 Account
创建,完成不同的业务逻辑。
/** * 账号监听,处理账号创建成功的后续逻辑 */ @Component public class AccountListener { /** * 1. 发送邮件、短信 */ @EventListener public void processAccountCreatedEvent1(AccountCreatedEvent event) { // TODO } /** * 2. 添加积分等,@Order(100) 用来设定执行顺序 */ @EventListener @Order(100) public void processAccountCreatedEvent2(AccountCreatedEvent event) { // TODO } /** * 3. 创建 lucene 索引等,@Async 用来标记为异步线程池中执行 */ @EventListener @Async public 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 }
-
value
和classes
作用相同,表示监听的一个或一组事件,用于支持方法中同一个父类的事件,例如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 微服务核心组件集:https://gitee.com/596392912/mica -
Avue
一款基于vue可配置化的神奇框架:https://gitee.com/smallweigit/avue -
pig
宇宙最强微服务(架构师必备):https://gitee.com/log4j/pig -
SpringBlade
完整的线上解决方案(企业开发必备):https://gitee.com/smallc/SpringBlade -
IJPay
支付SDK让支付触手可及:https://gitee.com/javen205/IJPay
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
更效率、更优雅 | 阿里巴巴开发者工具不完全盘点
(工欲善其事,必先利其器 - 图片来自网络 ) 文:王晨 从人工到自动化,从重复到创新,技术演进的历程中,伴随着开发者工具类产品的发展。 阿里巴巴将自身在各类业务场景下的技术积淀,通过开源、云上实现或工具等形式对外开放,本文将精选了一些阿里巴巴的开发者工具,希望能帮助开发者们提高开发效率、更优雅的写代码。 由于开发者涉及的技术领域众多,笔者仅从自己熟悉的领域,以后端开发者的视角盘点平时可能有得到的工具。每个工具按照以下几点进行介绍: 工具名称和简介 使用场景 使用教程 获取方式 一、Java 线上诊断工具 Arthas Arthas 阿里巴巴2018年9月开源的一款 Java 线上诊断工具。 使用场景 这个类从哪个 JAR 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 遇到
- 下一篇
如何画出一张合格的技术架构图?
阿里妹导读:技术传播的价值,不仅仅体现在通过商业化产品和开源项目来缩短我们构建应用的路径,加速业务的上线速率,也体现在优秀工程师在工作效率提升、产品性能优化和用户体验改善等经验方面的分享,以提高我们的专业能力。 接下来,阿里巴巴技术专家三画,将分享自己和团队在画好架构图方面的理念和经验,希望对你有所帮助。 当我们想用一张或几张图来描述我们的系统时,是不是经常遇到以下情况: 对着画布无从下手、删了又来? 如何用一张图描述我的系统,并且让产品、运营、开发都能看明白? 画了一半的图还不清楚受众是谁? 画出来的图到底是产品图功能图还是技术图又或是大杂烩? 图上的框框有点少是不是要找点儿框框加进来? 布局怎么画都不满意…… 如果有同样的困惑,本文将介绍一种画图的方法论,来让架构图更清晰。 先厘清一些基础概念 1、什么是架构? 架构就是对系统中的实体以及实体之间的关
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8编译安装MySQL8.0.19
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7