Spring中的事件监听器使用学习记录

 更新时间:2024年07月12日 10:11:35   作者:太自由  
Spring框架中的事件监听机制是一种设计模式,它允许你定义和触发事件,同时允许其他组件监听这些事件并在事件发生时作出响应,这篇文章主要介绍了Spring中的事件监听器使用学习,需要的朋友可以参考下

一、什么是Spring中的事件监听机制?

        Spring框架中的事件监听机制是一种设计模式,它允许你定义和触发事件,同时允许其他组件监听这些事件并在事件发生时作出响应。这种机制基于观察者模式,提供了一种松耦合的方式来实现组件间的通信。

二、Spring事件监听机制的关键概念        

1. 事件(Event)

        事件是应用程序中的一个信号,表明某个动作已经发生或某个条件已经满足。在Spring中,事件通常是实现ApplicationEvent接口的类来表示的。Spring为我们提供了多种内置的事件类型,如ContextStartedEvent、ContextRefreshedEvent,ContextCloseEvent、ContextStoppedEvent等事件,分别对应于应用程序上下文的不同生命周期阶段。当然我们也可以自定义自己的事件类型,即:通过实现ApplicationEvent接口或扩展ApplicationEvent类。

2. 事件发布者(Event Publisher)

        事件发布者负责将事件发布出去,然后通过Spring的智能事件派发,把发布的事件派发给对应该事件类型的所有监听器。在Spring中,ApplicationContext自身就是一个事件发布者(因为ApplicationContext接口继承了ApplicationEventPublisher接口),它可以发布应用程序事件(比如ContextRefreshedEvent ,ContextCloseEvent等事件)。【通常我们会让自定义组件实现 ApplicationEventPublisherAware接口,然后实现接口中的如下方法把事件发布者对象注入到组件中】

    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.applicationEventPublisher = applicationEventPublisher;
    }

3. 事件监听器(Event Listener)

        事件监听器是实现ApplicationListener接口的组件,它们可以监听和响应事件。监听器需要实现onApplicationEvent方法,以便在接收到事件时进行处理。此外,Spring给我们提供了一个 @EventListener注解,允许你直接在方法上标注以监听特定类型的事件。当事件发生时,Spring会自动调用这些方法。(注意:事件监听器一定要放入IOC容器中才会生效。)

4. 事件传播

        事件可以在不同的Spring容器之间传播,例如从子容器传播到父容器。

5. 同步与异步事件

        Spring支持同步和异步事件处理。

三、实现一个简单的事件监听功能

        需求描述: 程序中有一个添加用户的业务组件,要求当用户添加成功时,发布一个添加用户成功事件,然后通过添加用户成功事件的监听器给管理员发送一封邮件。

1. 业务组件

package com.shg.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.shg.beans.User;
public interface UserService extends IService<User> {
    User addUser(User user);
}
        
package com.shg.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.shg.beans.User;
import com.shg.listener.event.UserAddSuccessEvent;
import com.shg.mapper.UserMapper;
import com.shg.service.UserService;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Service;
@Service("userService")
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService, ApplicationEventPublisherAware {
    private ApplicationEventPublisher applicationEventPublisher;
    private final UserMapper userMapper;
    public UserServiceImpl(UserMapper userMapper) {
        this.userMapper = userMapper;
    }
    @Override
    public User addUser(User user) {
        userMapper.insert(user);
        applicationEventPublisher.publishEvent(new UserAddSuccessEvent(this, user));
        return user;
    }
    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.applicationEventPublisher = applicationEventPublisher;
    }
}

2. 添加用户成功事件

package com.shg.listener.event;
import com.shg.beans.User;
import org.springframework.context.ApplicationEvent;
public class UserAddSuccessEvent extends ApplicationEvent {
    private final User user;
    public UserAddSuccessEvent(Object source, User user) {
        super(source);
        this.user = user;
    }
    public User getUser() {
        return user;
    }
}

3. 添加用户成功事件监听器

package com.shg.listener;
import com.shg.listener.event.UserAddFailEvent;
import com.shg.listener.event.UserAddSuccessEvent;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
// 实现ApplicationListener接口的方式
// @Slf4j
// @Component
// public class UserAddListener implements ApplicationListener<UserAddSuccessEvent> {
//     @Override
//     public void onApplicationEvent(UserAddSuccessEvent event) {
//         log.info("创建用户:{}, 成功,已发送短信给管理员...", event.getUser());
//     }
// }
// 使用@EventListener的方式
@Slf4j
@Component
public class UserAddListener {
    @EventListener(value = {UserAddSuccessEvent.class})
    public void listenerUserAddSuccessEvent(UserAddSuccessEvent event) {
        log.info("创建用户:{}, 成功,已发送短信给管理员...", event.getUser());
    }
}

4. 运行结果

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

相关文章

  • 在 Spring Boot 项目中使用分页插件的两种常见方式示例详解

    在 Spring Boot 项目中使用分页插件的两种常见方式示例详解

    本文介绍了SpringBoot项目中两种分页插件的使用方法:MyBatis-Plus分页插件和PageHelper插件,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-10-10
  • 详解Java策略模式

    详解Java策略模式

    今天给大家带来的是关于Java的相关知识,文章围绕着Java策略模式展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • 日历显示读出输入的年月的java代码

    日历显示读出输入的年月的java代码

    这篇文章主要介绍了日历显示读出输入的年月的java代码,有需要的朋友可以参考一下
    2013-12-12
  • SpringBoot创建Docker镜像的方法步骤

    SpringBoot创建Docker镜像的方法步骤

    这篇文章主要介绍了SpringBoot创建Docker镜像的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Java找出两个大数据量List集合中的不同元素的方法总结

    Java找出两个大数据量List集合中的不同元素的方法总结

    本文将带大家了解如何快速的找出两个相似度非常高的List集合里的不同元素。主要通过Java API、List集合双层遍历比较不同、借助Map集合查找三种方式,需要的可以参考一下
    2022-10-10
  • Java实现字符串拆分的三种方法详解

    Java实现字符串拆分的三种方法详解

    字符串拆分,看似简单的操作,背后却隐藏着性能的玄机,本文将和大家详细介绍一下三种Java实现字符串拆分的方法,有需要的小伙伴可以参考一下
    2026-02-02
  • Java编程思想中关于并发的总结

    Java编程思想中关于并发的总结

    在本文中小编给大家整理的是关于Java编程思想中关于并发的总结以及相关实例内容,需要的朋友们参考下。
    2019-09-09
  • Intellij IDEA如何设置代理

    Intellij IDEA如何设置代理

    这篇文章主要介绍了Intellij IDEA如何设置代理问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • java清除u盘内存卡里的垃圾文件示例

    java清除u盘内存卡里的垃圾文件示例

    手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个文件占用了内存太大了
    2014-02-02
  • java数字和中文算数验证码的实现

    java数字和中文算数验证码的实现

    这篇文章主要介绍了java数字和中文算数验证码的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07

最新评论