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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • java实现酷狗音乐临时缓存文件转换为MP3文件的方法

    java实现酷狗音乐临时缓存文件转换为MP3文件的方法

    这篇文章主要介绍了java实现酷狗音乐临时缓存文件转换为MP3文件的方法,涉及java针对文件操作的相关技巧,需要的朋友可以参考下
    2016-08-08
  • Spring-Boot 访问外部接口的方案总结

    Spring-Boot 访问外部接口的方案总结

    在Spring-Boot项目开发中,存在着本模块的代码需要访问外面模块接口,或外部url链接的需求,针对这一需求目前存在着三种解决方案,下面将对这三种方案进行整理和说明,对Spring-Boot 访问外部接口方案感兴趣的朋友跟随小编一起看看吧
    2022-12-12
  • JAVA提高第七篇 类加载器解析

    JAVA提高第七篇 类加载器解析

    这篇文章主要为大家详细介绍了JAVA提高第七篇类加载器的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Java中的 FilterInputStream简介_动力节点Java学院整理

    Java中的 FilterInputStream简介_动力节点Java学院整理

    FilterInputStream 的作用是用来“封装其它的输入流,并为它们提供额外的功能”。接下来通过本文给大家分享Java中的 FilterInputStream简介,感兴趣的朋友一起学习吧
    2017-05-05
  • SpringBoot 整合 Elasticsearch 实现海量级数据搜索功能

    SpringBoot 整合 Elasticsearch 实现海量级数据搜索功能

    这篇文章主要介绍了SpringBoot 整合 Elasticsearch 实现海量级数据搜索,本文主要围绕 SpringBoot 整合 ElasticSearch 接受数据的插入和搜索使用技巧,在实际的使用过程中,版本号尤其的重要,不同版本的 es,对应的 api 是不一样,需要的朋友可以参考下
    2022-07-07
  • mybatis使用foreach语句实现IN查询(三种)

    mybatis使用foreach语句实现IN查询(三种)

    这篇文章主要介绍了mybatis使用foreach语句实现IN查询(三种),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 通过实例了解Java 8创建Stream流的5种方法

    通过实例了解Java 8创建Stream流的5种方法

    这篇文章主要介绍了通过实例了解Java 8创建Stream流的5种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Mybatis实现ResultMap结果集

    Mybatis实现ResultMap结果集

    本文主要介绍了Mybatis实现ResultMap结果集,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • IDEA下Servlet可能出现404的一些情况

    IDEA下Servlet可能出现404的一些情况

    相信有很多小伙伴遇到报错都不知道怎么处理,今天特地整理了这篇文章,文中对IDEA下Servlet可能出现404的一些情况作了详细的介绍,需要的朋友可以参考下
    2021-06-06
  • Java如何获取一个IP段内的所有IP地址

    Java如何获取一个IP段内的所有IP地址

    这篇文章主要为大家详细介绍了Java如何根据起始和结束的IP地址获取IP段内所有IP地址,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-11-11

最新评论