Java中Spring监听器的多种使用方式

 更新时间:2025年12月23日 15:39:34   作者:尤物程序猿  
文章介绍了Spring事件监听模型中的注解使用方式,重点讲解了@EventListener和@TransactionalEventListener的使用场景和参数,文章还提到在实际项目中,由于需要处理事务和缓存问题,感兴趣的朋友跟随小编一起看看吧

Java的spring事件监听模型还是很好用的。这里主要讲监听器的注解的使用方式。

最重要的有俩种注解

作用适用场景
@EventListener标记方法为事件监听器通用事件监听,*(非事务)
@TransactionalEventListener事务相关的事件监听需要事务绑定的事件(事务)

对于@EventListener,有三个参数

value、classes、condition

value和classes主要是指定相关事件的

condition是最常用的,使用Spring Expression Language (SpEL) 实现动态过滤。.

SpEL 表达式可以访问以下变量:

变量名等价形式说明
#root.eventevent当前事件对象
#root.argsargs方法参数数组
#a0#p0args[0]第一个参数
#a1#p1args[1]第二个参数
#orderEvent参数名为 orderEvent 的参数

也可以动态的注册一个spel函数

 public static boolean calculateLength(int type, String article) {
            //通过枚举解析type
//解析长度
        }

讲其注入到context中去

static class SpelFunctionRegister implements BeanFactoryAware, ApplicationContextAware {
        @Override
        public void setBeanFactory(BeanFactory beanFactory) 
               throws BeansException {
            // 注册自定义函数
            StandardEvaluationContext context = 
                ((StandardEvaluationContext) 
                 beanFactory.getBean(StandardEvaluationContext.class));
            try {
                // 注册一个计算评论内容的函数
                context.registerFunction("calculateLength",
                    CustomSpELFunctions.class.getDeclaredMethod(
                        "calculateLength", 
                        Integer.class, String.class));
            } catch (NoSuchMethodException e) {
                throw new RuntimeException("注册SpEL函数失败", e);
            }
        }
    }
@EventListener(condition = 
        "#calculatLenth(#event.commentType, #event.article)")
    public void handleDiscountOrder(OrderEvent event) {
        //符合评论类型、评论内容
    }

实际项目更常用的还是@TransactionalEventListener

将事件监听与数据库事务的生命周期绑定,解决了“何时触发事件处理”这个关键问题。

退可当普通监听器使用,进可处理事务相关的监听,

定义了四个参数

1:phase(重要参数) :以下四个策略

public enum TransactionPhase {
    // 四个关键阶段
    BEFORE_COMMIT,    // 事务提交前
    AFTER_COMMIT,     // 事务提交后(默认)是最常用的
    AFTER_ROLLBACK,   // 事务回滚后  
    AFTER_COMPLETION  // 事务完成后(无论成功失败)
}

2:value() 就是指定监听具体的事件的,含义差不多
3:classes() 就是指定监听具体的事件的,含义差不多

4:condition() 与@EventListenner差不多一个东西

为什么说@EventListener在实际项目好像使用的更多一点,平时写代码不怎么使用这玩意呢

1:大部分表的update、delete、add肯定都会用事务进行包装,而对于这些增删改操作又会涉及到一系列的问题。比如清理缓存、一致性补偿、异步编排等等十分常见,将代码解耦合。对于实际项目的一个接口而言代码过长不利于扩展、理解以及数据的正确性

2:清理多节点本地缓存也十分常用,对于多节点的分布式系统而言,不可能都采用的远程缓存来做,必然有很多的本地缓存,或者是本地+远程远程来做的,如果涉及到缓存数据相关业务数据的变更,如果我只在当前节点进行清理缓存,那么其他节点就有可能有脏数据的问题,如果缓存时间还长,那线上环境的影响是很大的。比如清理所有节点的更新的业务缓存数据。对于采用了本地缓存的业务,在业务变更需要进行publis事件来清除缓存是最高效的。

到此这篇关于spring的监听器的几种使用方式的文章就介绍到这了,更多相关spring监听器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot整合Junit实例过程解析

    SpringBoot整合Junit实例过程解析

    这篇文章主要介绍了SpringBoot整合Junit实例过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 在Linux系统上升级Java版本的两种方法步骤

    在Linux系统上升级Java版本的两种方法步骤

    由于项目升级,需要将JDK7升级到JDK8,升级JDK的同时也要升级一些其他的版本,下面这篇文章主要给大家介绍了关于在Linux系统上升级Java版本的两种方法步骤,需要的朋友可以参考下
    2024-09-09
  • 解析Spring Boot内嵌tomcat关于getServletContext().getRealPath获取得到临时路径的问题

    解析Spring Boot内嵌tomcat关于getServletContext().getRealPath获取得到临时

    大家都很纠结这个问题在使用getServletContext().getRealPath()得到的是临时文件的路径,每次重启服务,这个临时文件的路径还好变更,下面小编通过本文给大家分享Spring Boot内嵌tomcat关于getServletContext().getRealPath获取得到临时路径的问题,一起看看吧
    2021-05-05
  • Java Scanner类解析与实战教程

    Java Scanner类解析与实战教程

    Java Scanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输入,本文给大家介绍Java Scanner类解析与实战指南,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • spring boot中的静态资源加载处理方式

    spring boot中的静态资源加载处理方式

    这篇文章主要介绍了spring boot中的静态资源加载处理方式,需要的朋友可以参考下
    2017-04-04
  • Java练手小项目实现一个项目管理系统

    Java练手小项目实现一个项目管理系统

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用Java实现一个项目管理系统,大家可以在过程中查缺补漏,提升水平
    2021-10-10
  • Mybatis order by 动态传参出现的问题及解决方法

    Mybatis order by 动态传参出现的问题及解决方法

    今天,我正在愉快地CRUD,突然发现出现一个Bug,我们来看看是怎么回事吧!接下来通过本文给大家介绍Mybatis order by 动态传参出现的一个小bug,需要的朋友可以参考下
    2021-07-07
  • Java Spring ApplicationEvent 代码示例解析

    Java Spring ApplicationEvent 代码示例解析

    本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、事务绑定、执行顺序),对Java Spring ApplicationEvent概念相关知识感兴趣的朋友一起看看吧
    2025-06-06
  • 浅谈mybatis中的#和$的区别

    浅谈mybatis中的#和$的区别

    下面小编就为大家带来一篇浅谈mybatis中的#和$的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • Java框架Quartz中的Trigger简析

    Java框架Quartz中的Trigger简析

    这篇文章主要介绍了Java框架Quartz中的Trigger简析,所有类型的trigger都有TriggerKey这个属性,表示trigger的身份;除此之外,trigger还有很多其它的公共属性,这些属性,在构建trigger的时候可以通过TriggerBuilder设置,需要的朋友可以参考下
    2023-11-11

最新评论