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

相关文章

  • Java限流实现的几种方法详解

    Java限流实现的几种方法详解

    这篇文章主要介绍了Java限流实现的几种方法,通俗的说,限流就是 限制一段时间内,用户访问资源的次数,减轻服务器压力,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-12-12
  • SpringBoot添加富文本编辑器操作步骤

    SpringBoot添加富文本编辑器操作步骤

    富文本编辑器是一种能够编辑和展示富文本内容的工具或程序,与纯文本编辑器不同,富文本编辑器可以处理文本的格式、样式、布局等方面,使文本更加丰富多样,本文给大家介绍了SpringBoot添加富文本编辑器操作步骤,需要的朋友可以参考下
    2024-01-01
  • openjdk与Oraclejdk的区别

    openjdk与Oraclejdk的区别

    这篇文章主要介绍了openjdk与Oraclejdk的区别,帮助大家更好的了解JAVA,感兴趣的朋友可以了解下
    2020-08-08
  • java保留小数的四种实现方法

    java保留小数的四种实现方法

    这篇文章主要为大家详细介绍了java保留小数的四种实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • 基于Spring Boot应用ApplicationEvent案例场景

    基于Spring Boot应用ApplicationEvent案例场景

    这篇文章主要介绍了基于Spring Boot应用ApplicationEvent,利用Spring的机制发布ApplicationEvent和监听ApplicationEvent,需要的朋友可以参考下
    2023-03-03
  • 自定义注解和springAOP捕获Service层异常,并处理自定义异常操作

    自定义注解和springAOP捕获Service层异常,并处理自定义异常操作

    这篇文章主要介绍了自定义注解和springAOP捕获Service层异常,并处理自定义异常操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • MyBatis传入List集合查询数据问题

    MyBatis传入List集合查询数据问题

    这篇文章主要介绍了MyBatis传入List集合查询数据问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Mybatis打印替换占位符后的完整Sql教程

    Mybatis打印替换占位符后的完整Sql教程

    这篇文章主要介绍了Mybatis打印替换占位符后的完整Sql教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • mybatis log4j2打印sql+日志实例代码

    mybatis log4j2打印sql+日志实例代码

    在学习mybatis的时候,如果用log4j2来协助查看调试信息,则会大大提高学习的效率,加快debug速度,下面这篇文章主要给大家介绍了关于mybatis log4j2打印sql+日志的相关资料,需要的朋友可以参考下
    2022-08-08
  • springboot @RequiredArgsConstructor的概念与使用方式

    springboot @RequiredArgsConstructor的概念与使用方式

    这篇文章主要介绍了springboot @RequiredArgsConstructor的概念与使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09

最新评论