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实现简单扫码登录功能(模仿微信网页版扫码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • java正则表达式处理花括号内容替换赋值问题

    java正则表达式处理花括号内容替换赋值问题

    这篇文章主要介绍了java正则表达式处理花括号内容替换赋值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  •  基于Java解决华为机试之字符串合并处理实操

     基于Java解决华为机试之字符串合并处理实操

    这篇文章主要介绍了基于Java解决华为机试之字符串合并处理,文章以实操展开主题内容,具有一的参考价值,需要的小伙伴可以参考一下,希望对工作中的你有所帮助
    2022-02-02
  • 详解Java语言中的抽象类与继承

    详解Java语言中的抽象类与继承

    这篇文章主要为大家详细介绍了Java语言中的抽象类与继承的相关资料,文中的示例代码讲解详细,对我们学习Java有一定的帮助,感兴趣的小伙伴快跟随小编一起了解一下
    2022-10-10
  • idea中Tomcat启动失败的解决

    idea中Tomcat启动失败的解决

    这篇文章主要介绍了idea中Tomcat启动失败的解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • 简单解析java方法在调用在内存中的执行过程

    简单解析java方法在调用在内存中的执行过程

    这篇文章主要介绍了简单解析java方法在调用在内存中的执行过程,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • Springboot整合Shiro实现登录与权限校验详细解读

    Springboot整合Shiro实现登录与权限校验详细解读

    本文给大家介绍Springboot整合Shiro的基本使用,Apache Shiro是Java的一个安全框架,Shiro本身无法知道所持有令牌的用户是否合法,我们将整合Shiro实现登录与权限的验证
    2022-04-04
  • SpringBoot项目Jar包如何瘦身部署的实现

    SpringBoot项目Jar包如何瘦身部署的实现

    这篇文章主要介绍了SpringBoot项目Jar包如何瘦身部署的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 详解java配置文件的路径问题

    详解java配置文件的路径问题

    这篇文章主要介绍了详解java配置文件的路径问题的相关资料,这里对绝对路径及相对路径和classpath 类文件路径进行详细介绍,需要的朋友可以参考下
    2017-07-07
  • Java9的一些新特性介绍

    Java9的一些新特性介绍

    这篇文章主要介绍了Java9的一些新特性介绍,Java随着其开源的特点和甲骨文的推动正在不断改进中,需要的朋友可以参考下
    2015-07-07

最新评论