Springboot中如何自定义监听器

 更新时间:2024年07月01日 16:32:53   作者:树叶的一生啊  
这篇文章主要介绍了Springboot中自定义监听器,自定义事件需要继承ApplicationEvent类,并添加一个构造函数,用于接收事件源对象,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧

一、监听器模式图

二、监听器三要素广播器:

  • 广播器:用来发布事件
  • 事件:需要被传播的消息
  • 监听器:一个对象对一个事件的发生做出反应,这个对象就是事件监听器

三、监听器的实现方式

1、实现自定义事件

自定义事件需要继承ApplicationEvent类,并添加一个构造函数,用于接收事件源对象。
该事件中添加了一个SysUser对象,用于传递用户信息。

package com.ruoyi.web.listener;
import com.ruoyi.common.core.domain.entity.SysUser;
import org.springframework.context.ApplicationEvent;
/**
 * @Description: 自定义事件
 * @Author: baiwen
 * @createTime: 2024年06月19日 13:10:07
 */
public class MyEvent extends ApplicationEvent {
    private SysUser sysUser;
    public MyEvent(Object source, SysUser sysUser) {
        super(source);
        this.sysUser = sysUser;
    }
    public SysUser getSysUser() {
        return sysUser;
    }
}

2、实现自定义监听器

自定义监听器需要实现ApplicationListener接口,并重写 onApplicationEvent方法。
接口中的泛型参数为自定义事件类型,表示监听该类型的事件。
可以从该事件中获取用户信息,并进行相应的处理。

package com.ruoyi.web.listener;
import com.ruoyi.common.core.domain.entity.SysUser;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
/**
 * @Description: 自定义监听器
 * @Author: baiwen
 * @createTime: 2024年06月19日 13:12:39
 */
@Component
public class MyEventListener implements ApplicationListener<MyEvent> {
    @Override
    public void onApplicationEvent(MyEvent event) {
        SysUser sysUser = event.getSysUser();
        System.out.println("监听到了事件,用户名:" + sysUser.getUserName());
    }
}

3、发布自定义事件

在需要发布事件的地方,使用ApplicationEventPublisher的publishEvent方法来发布事件。
这里使用Test类来模拟事件发布,实际应用中可以根据具体需求来选择合适的发布场景。

package com.ruoyi.test;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.web.listener.MyEvent;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
/**
 * @Description:
 * @Author: baiwen
 * @createTime: 2024年06月19日 13:16:33
 */
@SpringBootTest
@RunWith(SpringRunner.class)
public class MyEventPushTest {
    @Resource
    private ApplicationEventPublisher applicationEventPublisher;
    @Test
    public void testpublishEvent() throws InterruptedException
    {
        SysUser sysUser = new SysUser();
        sysUser.setUserName("zhangsan");
        System.out.println("发布MyEvent事件。。。");
        applicationEventPublisher.publishEvent(new MyEvent(this, sysUser));
    }
}

4、测试

运行MyEventPushTest类中的testpublishEvent方法,控制台会输出以下内容:

发布MyEvent事件。。。

监听到了事件,用户名:zhangsan

5、其他实现方案

主要是监听器的注册方式不同,目的只有一个,把监听器加入到spring容器中。

方式一,就是上面的MyEventListener类是通过@Component注解将该类注册为Spring的Bean,从而实现监听器的功能。

方式二,可以通过在启动类中添加监听器的方式,使监听器生效。

package com.ruoyi;
import com.ruoyi.web.listener.MyEventListener;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
/**
 * 启动程序
 * 
 * @author baiwen
 */
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class RuoYiApplication
{
    public static void main(String[] args)
    {
        new SpringApplicationBuilder(RuoYiApplication.class).listeners(new MyEventListener()).run(args);
    }
}

方式三,可以通过配置spring.factories,使监听器生效。

在resource文件夹下创建META-INF/spring.factories文件。

配置内容如下:

# 监听器
org.springframework.context.ApplicationListener=com.ruoyi.web.listener.MyEventListener

除此之外,还有第四种方式,通过@EventListener注解实现监听器的功能。
通过@EventListener注解的condition属性来指定监听的事件类型。

package com.ruoyi.web.listener;
import com.ruoyi.common.core.domain.entity.SysUser;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
/**
 * @Description: 自定义监听器2
 * @Author: baiwen
 * @createTime: 2024年06月19日 14:07:57
 */
@Component
public class MyEventListener2 {
    @EventListener(MyEvent.class)
    public void listenerApplicationStarted(MyEvent event) {
        SysUser sysUser = event.getSysUser();
        System.out.println("注解方式监听到了事件,用户名:" + sysUser.getUserName());
    }
}

发布事件后,可以看到能正常监听到事件。

发布MyEvent事件。。。
注解方式监听到了事件,用户名:zhangsan

​​​​​​​总结

以上,就是SpringBoot中实现监听器的四种方式。

至于监听器的实现原理,后续再补充。

到此这篇关于Springboot中自定义监听器的文章就介绍到这了,更多相关Springboot自定义监听器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot自定义配置项过程

    SpringBoot自定义配置项过程

    在SpringBoot项目中,通过在application.properties文件中添加配置项,然后使用@ConfigurationProperties注解将这些配置项与实体Bean进行绑定,可以实现配置项与实体类字段的自动关联,进而方便地读取配置文件中的数据,这种方法不仅简化了配置管理
    2024-11-11
  • java基础之字符串编码知识点总结

    java基础之字符串编码知识点总结

    这篇文章主要介绍了java基础之字符串编码总结,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有很好的帮助,要的朋友可以参考下
    2021-04-04
  • java组件smartupload实现上传文件功能

    java组件smartupload实现上传文件功能

    这篇文章主要为大家详细介绍了java组件smartupload实现上传文件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • SpringBoot框架如何操作Excel和PDF

    SpringBoot框架如何操作Excel和PDF

    Excel和PDF都是常见的办公文件类型,在实际需求中有着较多的应用,excel经常用来处理数据,PDF文件格式可以将文字、字型、格式、颜色及独立于设备和分辨率的图形图像等封装在一个文件中,本文就讲述下SpringBoot框架如何操作这两种类型的文件
    2021-06-06
  • JAVA宝藏工具hutool的使用

    JAVA宝藏工具hutool的使用

    开发过程中总是会遇到需要自己自定义工具类的情况,做一些数据转换、字符串操作、日期处理、加解密、编解码、金额计算等,本文就详细的介绍有一个工具类hutool的使用,感兴趣的可以了解一下
    2021-10-10
  • SpringBoot配置logback.xml 多环境的操作步骤

    SpringBoot配置logback.xml 多环境的操作步骤

    最近在研究springboot的日志,所以记录一下,做一下总结,今天重点给大家介绍SpringBoot配置logback.xml 多环境的操作步骤,要实现多环境的配置,主要是依赖于springboot的application.yml文件去实现,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • java搭建ftp/sftp进行数据传递的全过程

    java搭建ftp/sftp进行数据传递的全过程

    ftp是一种文件传输协议,让客户端和服务端能够互相传递文件,图片等数据,sftp也是一种文件传输协议,但是相比较而言要比ftp安全性更好些,但是也有缺点就是传输效率低
    2021-07-07
  • MyBatis中association的基本使用方法

    MyBatis中association的基本使用方法

    在项目中某些实体类之间肯定有关键关系,比如一对一,一对多等,在hibernate中用one to one和one to many,而mybatis中就用association和collection,下面这篇文章主要给大家介绍了关于MyBatis中association基本使用方法的相关资料,需要的朋友可以参考下
    2022-09-09
  • Springboot引入hibernate配置自动建表并进行增删改查操作

    Springboot引入hibernate配置自动建表并进行增删改查操作

    这篇文章主要介绍了Springboot引入hibernate配置自动建表并进行增删改查,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • java自定义填充excel并导出的方法代码实例

    java自定义填充excel并导出的方法代码实例

    这篇文章主要给大家介绍了关于java自定义填充excel并导出的相关资料,使用Java在Spring框架中实现一个接口,该接口可以将JSON数据导出为Excel文件,文章涵盖了从加载Excel模板、创建单元格样式到填充数据并返回响应的整个过程,需要的朋友可以参考下
    2024-12-12

最新评论