springboot监听器

简介: springboot监听器

最近在项目中引入了一个事务提交后的监听器,现对这些功能做一个阶段性的总结:

什么是监听器?
  1. 就是用来监听程序执行的。监听器可以做什么事?可以监听程序执行,使程序在不同的阶段做不同的事情,并且与程序主业务逻辑解耦.
  2. web监听器就是Servlet中特殊的类,他们能帮助开发者监听web中的特定事件,比如ServletContext、HttpSession、ServletRequest的创建和销毁;变量的创建、销毁和修改等。可以在某些动作前后增加处理,实现监控等等。
Spring 监听器包含一下模块:
发布器(ApplicationEventPublisher):用来在业务逻辑中发布事件。
复制代码
广播器(ApplicationEventMulticaster):用来把发布的事件广播给支持当前事件的监听器。
复制代码
监听器(ApplicationListener):用来监听自己感兴趣的事件,当程序发布事件时,可以执行一些相应的业务逻辑。ApplicationListener定义了onApplicationEvent方法,监听器监听到事件发布后执行onApplicationEvent方法。
复制代码
事件(ApplicationEvent):用来定义事件。
复制代码
Spring的监听器执行步骤:
  • 小知识:Spring boot项目启动时会扫描项目中的监听器并加载到广播器中,所以广播器广播的时候能获取到所有的监听器。 Spring boot识别项目中的监听器规则是:@EventListener注解标注的方法,ApplicationListener接口的实现类。
程序在执行时调用SpringBoot的发布器(ApplicationEventPublisher)发布事件(ApplicationEvent)
复制代码
发布器(ApplicationEventPublisher)调用广播器(ApplicationEventMulticaster)把事件广播给支持当前事件的监听器(ApplicationListener)。通俗的话描述,就是广播器根据发布的事件,从所有的监听器中筛选出支持当前事件的监听器。
复制代码
执行监听器。Spring boot的监听器必须实现ApplicationListener接口并重写onApplicationEvent(Eevent)方法。执行监听器就是广播器筛选出符合条件的监听器后执行onApplicationEvent方法。
复制代码

对于网上查询的一些监听器的应用,很多都是根据上下文初始化一些数据,做一些统计等,而针对于监听事务提交后触发事件这一个,springboot提供了一个@TransactionalEventListener

具体的实现如下:
  1. 需要我们创建3个类,对应的分别是 事件, 监听器, 发布器,
//发布器中实现ApplicationEventPublisherAware接口,同时初始化ApplicationEventPublisher
@Slf4j
@Component
public class cachePublisher implements ApplicationEventPublisherAware {
    //spring boot的事件发布器
    private ApplicationEventPublisher applicationEventPublisher;
    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.applicationEventPublisher = applicationEventPublisher;
    }
    /**
     * Desc: 发布事件,根据发布缓存事件的参数类型先构造对应的Event对象再发布事件 <br>
     * date: 2022/9/3   
     * @param event
     * @return void
     */
    public void publishEvent(Object event){
        applicationEventPublisher.publishEvent(new RefreshCacheEvent(this,(RefreshCache)event));
    }
}
复制代码
  1. 事件继承ApplicationEvent 声明事件的类型,同时监听器中通过入参的类型确定是哪一种事件监听
public class RefreshCacheEvent extends ApplicationEvent {
    private final RefreshCache refreshCache;
    public RefreshCache getRefreshCache() {
        return refreshCache;
    }
    public RefreshEvent(Object source, RefreshCache refreshCache) {
        super(source);
        Assert.notNull(refreshCache, "refreshCache must not be null");
        this.refreshCache = refreshCache;
    }
}
复制代码
  1. 监听器采用注解方式实现,@TransactionalEventListener  中间制定了监听器生效的时间,事件的类型,发生异常后如何处理
@Slf4j
@Component
@ConditionalOnBean(name={"refreshCacheService"})
public class RefreshCacheListener {
    @Resource
    private RefreshCacheService refreshCacheService;
    /***
     * Desc: 门户缓存刷新事件 <br>
     *     @TransactionalEventListener 注解表示此监听器是一个事务监听器,在事件发布方事务的对应阶段执行此监听器事件。
     *                                   phase 表示事务的阶段
     *                                   classes 表示监听的事件类型
     *                                   fallbackExecution 没有事务运行是否处理此事件,默认false
     */
    @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT,
                                classes = {RefreshCacheEvent.class},
                                fallbackExecution = true)
    public void onApplicationEvent(RefreshCacheEvent event){
        //发送刷新缓存的消息
        refreshCacheService.sendMessage(event.getRefreshCache().getType());
    }
}
复制代码

使用的地方注入 RefreshPublisher

refreshCachePublisher.publishEvent(refreshSingleJournalCache);


相关文章
|
4月前
|
Web App开发 监控 Java
|
4月前
|
安全 Java Spring
SpringBoot2 | SpringBoot监听器源码分析 | 自定义ApplicationListener(六)
SpringBoot2 | SpringBoot监听器源码分析 | 自定义ApplicationListener(六)
75 0
|
21天前
|
前端开发 JavaScript Java
【实操】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本
本文介绍了一个结合SpringBoot和Python的实用功能,旨在监控iPhone 15的库存状态并通过邮件提醒用户。系统采用SpringBoot监听苹果官网API,解析JSON数据判断是否有货,并展示最近的库存记录。此外,还能自动触发Selenium+Python脚本实现自动化购买。文中详细介绍了技术栈、接口分析、邮件配置及自动化脚本的设置方法。该项目不仅适用于熟悉后端开发的人员,也适合回顾Layui和Jquery等前端技术。
38 0
【实操】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本
|
1月前
|
缓存 Java 数据库
Spring Boot中使用监听器
系统的介绍了监听器原理,以及在 Spring Boot 中如何使用监听器,列举了监听器的三个常用的案例,有很好的实战意义。最后讲解了项目中如何自定义事件和监听器,并结合微服务中常见的场景,给出具体的代码模型,均能运用到实际项目中去,希望读者认真消化。
|
4月前
|
NoSQL Java Redis
Spring Boot 监听 Redis Key 失效事件实现定时任务
Spring Boot 监听 Redis Key 失效事件实现定时任务
115 0
|
3月前
|
监控 NoSQL Java
在 Spring Boot 中实现 Redis 的发布/订阅功能可以通过 RedisTemplate 和消息监听器来完成
在 Spring Boot 中实现 Redis 的发布/订阅功能可以通过 RedisTemplate 和消息监听器来完成
133 1
|
4月前
|
Java 容器
SpringBoot3 事件和监听器
SpringBoot3 事件和监听器
|
4月前
|
消息中间件 Java Maven
springboot 使用注解的方式创建rabbitmq的交换机、路由key、以及监听队列的名称
springboot 使用注解的方式创建rabbitmq的交换机、路由key、以及监听队列的名称
|
4月前
|
NoSQL Java Redis
Spring boot 实现监听 Redis key 失效事件
【2月更文挑战第2天】 Spring boot 实现监听 Redis key 失效事件
414 0