SpringBoot事件监听器@EventListener的实现

 更新时间:2024年11月14日 11:46:16   作者:只想早点下班  
@EventListener注解用于处理应用程序事件,提供了一种方便的方式来监听和响应各种事件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1.概述

  • 在 Spring 框架中,@EventListener是一个用于处理应用程序事件的注解。它提供了一种方便的方式来监听和响应各种事件,使得代码可以基于事件驱动的方式进行架构。通过@EventListener注解,可以将一个方法标记为事件监听器,当对应的事件被发布时,该方法就会被自动调用。

2.事件驱动架构基础

  • 事件(Event):事件是对应用程序中某个动作或者状态变化的抽象表示。例如,用户注册成功、订单已支付、文件上传完成等都可以看作是事件。在Spring 中,事件通常是一个继承自ApplicationEvent的类。
  • 事件发布者(Publisher):负责发布事件的组件。它会在特定的业务逻辑执行过程中,创建并发布事件。例如,在用户注册服务类中,当用户注册成功后,会发布一个UserRegisteredEvent。
  • 事件监听器(Listener):通过@EventListener注解标记的方法所在的类就是事件监听器。它会订阅感兴趣的事件,当事件发布时,监听器中的相应方法就会被触发,执行自定义的逻辑,如发送欢迎邮件、更新用户积分等。

3.使用示例

  • 定义事件类:首先需要定义一个事件类,继承自ApplicationEvent。例如,定义一个用户注册成功的事件类:
  • 这里UserRegisteredEvent类继承自ApplicationEvent,并且包含了一个User对象,用于传递用户相关的信息。
  • 发布事件:在业务逻辑中,当用户注册成功后,发布事件。假设在一个UserService类中有一个用户注册方法:
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    private final ApplicationEventPublisher eventPublisher;

    public UserService(ApplicationEventPublisher eventPublisher) {
        this.eventPublisher = eventPublisher;
    }

    public void registerUser(User user) {
        // 实际的用户注册逻辑,如保存用户信息到数据库等
        //...
        // 注册成功后发布事件
        UserRegisteredEvent event = new UserRegisteredEvent(this, user);
        eventPublisher.publishEvent(event);
    }
}
  • 这里UserService类通过构造函数注入了ApplicationEventPublisher,在用户注册成功后,创建UserRegisteredEvent并发布。
  • 监听事件:使用@EventListener注解来监听事件。例如,创建一个监听器类来发送欢迎邮件给新注册用户:
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class WelcomeEmailListener {
    @EventListener
    public void sendWelcomeEmail(UserRegisteredEvent event) {
        User user = event.getUser();
        // 发送欢迎邮件的逻辑,如调用邮件发送服务
        System.out.println("发送欢迎邮件给用户: " + user.getEmail());
    }
}
  • 在这个WelcomeEmailListener类中,sendWelcomeEmail方法使用@EventListener注解标记,当UserRegisteredEvent事件被发布时,该方法就会被调用,从而实现发送欢迎邮件的逻辑。

4.事件监听器的灵活性和配置

  • 监听多个事件:一个@EventListener注解的方法可以监听多个事件。可以通过方法参数的类型来指定要监听的事件。例如:
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class MultipleEventListener {
    @EventListener
    public void handleEvents(UserRegisteredEvent userEvent, OrderPlacedEvent orderEvent) {
        if (userEvent!= null) {
            System.out.println("处理用户注册事件");
            // 用户注册事件相关逻辑
        }
        if (orderEvent!= null) {
            System.out.println("处理订单放置事件");
            // 订单放置事件相关逻辑
        }
    }
}
  • 在这个例子中,handleEvents方法可以同时监听UserRegisteredEvent和OrderPlacedEvent事件,根据传入的参数类型来区分是哪个事件,并执行相应的逻辑。
  • 异步监听事件:可以通过配置让事件监听器以异步方式执行,提高应用程序的性能和响应速度。在 Spring Boot 中,可以通过@EnableAsync注解来启用异步支持,然后在@EventListener注解中添加async = true属性。例如:
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;

@Configuration
@EnableAsync
public class AsyncConfig {
    // 配置类内容
}
  • 然后在监听器方法中:
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

@Component
public class AsyncEventListener {
    @Async
    @EventListener
    public void handleAsyncEvent(UserRegisteredEvent event) {
        // 异步执行的逻辑,如发送短信通知等,不会阻塞主线程
        System.out.println("异步处理用户注册事件");
    }
}

5.SpringBoot内置的监听器

  • Spring中内置监听器例如:ApplicationReadyEvent监听器、ApplicationStartedEvent监听器、ServletWebServerInitializedEvent监听器等。这些监听器可以通过实现 ApplicationListenner<> 泛型接口 泛型参数必须是 ApplicationEvent本身或者子类。
  • 在这个例子中实现了 ApplicationReadyEvent 监听器,ApplicationReadyEvent是 Spring Boot 中一个非常重要的事件。它在 Spring 应用程序完全准备好接收请求之后触发,这意味着所有的 Spring bean 都已经被初始化,配置文件已经加载,并且应用程序上下文已经完全刷新。
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class ApplicationReadyEventListener implements ApplicationListener<ApplicationReadyEvent> {
    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        System.out.println("应用程序已准备好,可以开始接收请求啦!");
        // 在这里可以进行数据库连接检查、缓存预热等操作
        // 例如,这里加载一些redis缓存啦。什么什么的.......
    }
}

到此这篇关于SpringBoot事件监听器@EventListener的实现的文章就介绍到这了,更多相关SpringBoot @EventListener内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Spring Boot中使用RabbitMQ 生产消息和消费消息的实例代码

    Spring Boot中使用RabbitMQ 生产消息和消费消息的实例代码

    本文介绍了在SpringBoot中如何使用RabbitMQ进行消息的生产和消费,详细阐述了RabbitMQ中交换机的作用和类型,包括直连交换机、主题交换机、扇出交换机和头交换机,并解释了各自的消息路由机制,感兴趣的朋友一起看看吧
    2024-10-10
  • Java阻塞延迟队列DelayQueue原理及使用详解

    Java阻塞延迟队列DelayQueue原理及使用详解

    这篇文章主要介绍了Java阻塞延迟队列DelayQueue原理及使用详解,阻塞队列是一个支持两个附加操作的队列,这两个附加的操作是:在队列为空时,从队列中获取元素的消费者线程会一直等待直到队列变为非空,需要的朋友可以参考下
    2023-12-12
  • mybatis映射文件操作存储过程的实现

    mybatis映射文件操作存储过程的实现

    本文主要介绍了mybatis映射文件操作存储过程的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 使用Feign动态设置header和原理分析

    使用Feign动态设置header和原理分析

    这篇文章主要介绍了使用Feign动态设置header和原理分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Spring Boot Admin 添加报警提醒和登录验证功能的具体实现

    Spring Boot Admin 添加报警提醒和登录验证功能的具体实现

    报警提醒功能是基于邮箱实现的,当然也可以使用其他的提醒功能,如钉钉或飞书机器人提醒也是可以的,但邮箱报警功能的实现成本最低,所以本文我们就来看邮箱的报警提醒功能的具体实现
    2022-01-01
  • SpringBoot @Validated注解实现参数分组校验的方法实例

    SpringBoot @Validated注解实现参数分组校验的方法实例

    这篇文章主要给大家介绍了关于SpringBoot @Validated注解实现参数分组校验的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 详解Java中ByteArray字节数组的输入输出流的用法

    详解Java中ByteArray字节数组的输入输出流的用法

    ByteArrayInputStream和ByteArrayOutputStream分别集成自InputStream和OutputStream这两个输入和输出流,这里我们就来详解Java中ByteArray字节数组的输入输出流的用法,需要的朋友可以参考下
    2016-06-06
  • SpringBoot获取不到用户真实IP的解决方法

    SpringBoot获取不到用户真实IP的解决方法

    最近遇到个问题,项目部署后发现服务端无法获取到客户端真实的IP地址,本文就来介绍一下这个问题的解决方法,感兴趣的可以了解一下
    2023-08-08
  • Spring Data JPA 整合QueryDSL的使用案例

    Spring Data JPA 整合QueryDSL的使用案例

    QueryDSL 是一个用于构建类型安全的 SQL 查询的 Java 库,它的主要目标是简化在 Java 中构建和执行 SQL 查询的过程,同时提供类型安全性和更好的编码体验,对Spring Data JPA 整合QueryDSL使用案例感兴趣的朋友跟随小编一起看看吧
    2023-08-08
  • 剑指Offer之Java算法习题精讲二叉树与斐波那契函数

    剑指Offer之Java算法习题精讲二叉树与斐波那契函数

    跟着思路走,之后从简单题入手,反复去看,做过之后可能会忘记,之后再做一次,记不住就反复做,反复寻求思路和规律,慢慢积累就会发现质的变化
    2022-03-03

最新评论