Spring Event事件用法 Spring Boot Event事件发布和订阅 Spring Event事件发布 Spring Event事件订阅

news2024/11/24 12:55:51

        Spring Event事件用法 Spring Boot Event事件发布和监听 Spring Event事件发布 Spring Event事件订阅

一、概述

        在Spring中可以使用 Spring Event 事件机制,实现功能解耦合。 本文 主要讲解 Spring Event的用法 ,至于那些 介绍啊,观察者模式,实现原理 ,请自行查找资料解决。

主要讲解以下几个方面内容:

    • 事件发布
    • 事件订阅 【监听】
    • Spring 内置的4个事件

二、代码实现

1、事件发布 --- 普通对象

        发布普通对象,任意的Java对象,都是可以作为 Spring Event的事件发布,该代码案例将 ApplicationContext发布普通对象事件

1.1、普通的 Java Bean UserInfo

@Data
public class UserInfo {
    private Integer id ;
    private String name;
}

1.2 ApplicationContext 发布事件

@Autowired
private ApplicationContext applicationContext;

@PostMapping("/register2")
public UserInfo register(@RequestBody UserInfo userInfo){
    log.info("register success , userInfo ={}", JSON.toJSONString(userInfo));
    applicationContext.publishEvent(userInfo);
    return userInfo;
}

2、事件发布 --- ApplicationEvent 子类

        发布ApplicationEvent对象,需要继承ApplicationEvent类,该代码案例将实现 ApplicationEventPublisherAware 接口,发布事件。

2.1、继承 ApplicationEvent 的 UserEvent 类


public class UserEvent extends ApplicationEvent {
    private String userName ;
    public UserEvent(String userName) {
        super(userName);
        this.userName = userName;
    }
    public String getUserName() {
        return userName;
    }
}

2.2、创建 PublishService类,用于事件发布


@Component
public class PublishService implements ApplicationEventPublisherAware {
    private ApplicationEventPublisher publisher ;
    
    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        publisher = applicationEventPublisher;
    }

    public void pub(Object event){
        publisher.publishEvent(event);
    }
}

2.3、PublishService类发布事件

    @Autowired
    private PublishService publishService;

    @PostMapping("/register")
    public UserEvent register(@RequestBody Map map){
        String userName = "小明default";
        if(Objects.nonNull(map.get("userName"))){
            userName = map.get("userName").toString();
        }
        log.info("register success , userName ={}",userName);
        final UserEvent userEvent = new UserEvent(userName);
//        applicationContext.publishEvent(userEvent);
        publishService.pub(userEvent);
        return userEvent;
    }

3、事件监听 --- ApplicationListener 接口

        实现ApplicationListener接口,可以实现Spring Event事件的监听,缺点是,只能监听 ApplicationEvent 的子类对象,不能监听普通对象。

@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
   /**
    * Handle an application event.
    * @param event the event to respond to
    */
   void onApplicationEvent(E event);
}

3.1、创建GeneralEventListener类,实现事件的监听


@Slf4j
@Component
public class GeneralEventListener implements ApplicationListener<ApplicationEvent> {

    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        log.warn("GeneralEventListener name = {}" ,event.getClass().getSimpleName());
        if(event instanceof ContextRefreshedEvent){
            log.info("ContextRefreshedEvent execute ~~ !");
        }
        if(event instanceof UserEvent){
            System.out.println(Thread.currentThread().getName()+" , GeneralEventListener userName="+event.getSource());
        }
    }
}

4、事件监听 --- @EventListener 注解

        @EventListener 注解,可以实现全部的Spring Event事件的监听,包括:ApplicationEvent和普通的Java对象,都可以进行监听。 @EventListener注解中,可以通过属性配置,实现指定的事件监听。

4.1、创建UserEventListener类,实现事件监听

@Slf4j
@Component
public class UserEventListener {
    /**
     * Description: 监听 普通对象 --- 非 ApplicationEvent 的子类
     * @param userInfo
     * @return void
     * @version v1.0
     * @author wu
     * @date 2023/4/24 13:59
     */
    @EventListener
    public void onUserInfo(UserInfo userInfo){
        log.info("onUserInfo~ value={}", JSON.toJSONString(userInfo));
        msgService.sendMsg(userInfo.getName());
    }
}

三、总结

        1、本文总结了 Spring Event事件的用法和代码案例,可以发布普通对象和ApplicationEvent对象事件,同理可以监听 对应的两种事件。 日常开发中,建议使用 @EventListener 注解监听事件,功能更强大。

        2、Spring 内置的4个事件分别是:

      • ContextStartedEvent:Spring Context 启动完成事件。
      • ContextStoppedEvent:Spring Context 停止完成事件。
      • ContextClosedEvent:Spring Context 停止开始事件。
      • ContextRefreshedEvent:Spring Context 初始化或刷新完成事件。

        3、经过测试,Spring Event事件执行,默认是同步执行,即: 发布事件后,需要等待 事件监听方,代码执行完毕后,才会继续往下执行。若要调整为异步执行,可以使用@Async注解来实现异步,或者使用线程池来实现异步。

@Async // 事件异步执行
@EventListener
public void onUserInfo(UserInfo userInfo){
    log.info("onUserInfo~ value={}", JSON.toJSONString(userInfo));
    msgService.sendMsg(userInfo.getName());
}

参考资料:

Spring 异步@Async注解用法

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/741062.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开悟AIArena,深度学习神经网络,暑假开悟比赛的学习

目录 1.赛题简介 1.1.赛题目标 1.2.地图介绍 1.3.规则介绍 2.环境介绍 2.1.观测空间&#xff08;Observation Space&#xff09; 2.1.1.原始数据&#xff1a; 2.1.2.特征数据 2.1.3.特征提取 2.2.动作空间&#xff08;Action Space&#xff09; 2.3.坐标介绍&#xf…

1.MySQL - WindTerm Linux 使用

目录 一、云服务器的使用 二、Linux 和 发行版 三、云服务器的基本操作 四、WindTerm&#xff08;一款 SSH 客户端&#xff09; 4.1 设置 WindTerm 外观 4.2 打开文件管理器 4.3 连接云服务器 4.4 参数 4.5 常见命令 4.5.1 清理屏幕&#xff08;滚屏&#xff09; …

【雕爷学编程】Arduino动手做(158)---VL53L0X激光测距模块2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

TCP 协议(一)报文结构

TCP 协议&#xff08;一&#xff09;报文结构 TCP 协议&#xff08;二&#xff09;连接与断开 TCP 协议&#xff08;三&#xff09;十种核心机制 TCP 提供面向连接的通信传输&#xff0c;面向连接是指在传送数据之前必须先建立连接&#xff0c;数据传送完成后要释放连接。无论…

从零开始——springboot增删改查小demo

首先&#xff0c;先创建数据库 -----sushe,然后创建表 person&#xff0c;表结构是这样的&#xff0c;一共四个字段。 向里面添加一些寝室成员数据即可。 INSERT INTO person(p_id,p_name,p_phone,p_score)VALUES (1,李阳,123456,7890), (2,张骞,123456,7890), (3,马康敬,1234…

【C语言】指针概要

文章目录 一、什么是指针二、指针类型三、野指针四、二级指针五、字符指针六、数组指针定义数组名 七、函数指针 一、什么是指针 指针就是地址&#xff0c;口语中说的指针通常指的是指针变量。我们可以通过&&#xff08;取地址操作符&#xff09;取出变量的内存起始地址&a…

Nginx转发域名与新增SSL证书校验

1.申请SSL证书 各大资源&#xff1a;SSL免费证书资源 2.我选择的是站点服务 申请成功的界面&#xff1a; 官网安装教程&#xff1a;看看就好系列 3.下载成功后把文件当道nginx中的目录下 4.编写nginx.config配置 增加server配置 通过监听zlXXX.cc域名访问 重定向到https…

C人脸识别

1、原始图片&#xff1a; 2、灰度化下&#xff1a; 3、均值滤波&#xff1a; 4、 二值图加边缘检测 5、生成积分图 6、把待检测的人脸区域划分为25个&#xff0c;因为是一个数组&#xff0c;这样分别统计每个区域的像素个数&#xff1a; x0: 60, y0: 100, x1: 157, y1: 200 …

X86架构上的Linux操作系统安装与配置ARM架构(并进行示例测试/为DDS编译打基础)

1 查看Linux操作系统是运行在X86架构还是ARM架构平台上2 X86和ARM到底是什么关系&#xff1f;3 X86、ARM、Linux三者的关系到底是什么&#xff1f;&#xff08;大白话理解&#xff09;4、在X86架构的Linux操作系统上搭建ARM架构并进行测试&#xff08;看elf文件的类型是否属于a…

Spark---第 1 章 Spark 内核概述

Spark 内核泛指 Spark 的核心运行机制&#xff0c;包括 Spark 核心组件的运行机制、Spark 任务调度机制、Spark 内存管理机制、Spark 核心功能的运行原理等&#xff0c;熟练掌握 Spark 内核原理&#xff0c;能够帮助我们更好地完成 Spark 代码设计&#xff0c;并能够帮助我们准…

HTML5+CSS3小实例:带进度条的人物卡片切换效果

实例:带进度条的人物卡片切换效果 技术栈:HTML+CSS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" conte…

XHcms 1.0代码审计

关于熊海CMS1.0的代码审计&#xff0c;一直想要提升自己的代码审计的能力&#xff0c;php没有继续去深入的学习这门语言&#xff0c;反而直接是审计CMS&#xff0c;就拿着熊海CMS来进行审计。 关于熊海cms的源码&#xff0c;附在下方&#xff1a; 链接&#xff1a;https://pan…

How to Write and Publish a Scientific Paper-Preparing the Tables and Figures

Preparing the Tables and Figures 目录 Preparing the Tables and FiguresWHEN TO USE TABLESHOW TO ARRANGE TABULAR MATERIALEXPONENTS IN TABLE HEADINGSFOLLOWING THE JOURNAL’S INSTRUCTIONSTITLES, FOOTNOTES, AND ABBREVIATIONSADDITIONAL TIPS ON TABLES WHEN TO USE…

algo算法实验平台代码分享

algo算法实验平台代码分享 1. 介绍 本实验平台包括前端及后台两个模块&#xff0c;前端由 vue开发而来&#xff0c;后端主要采用 python编写&#xff0c;主要用于算法效果测试测评及改进。 原平台算法已做脱敏&#xff0c;使用者可以根据自己需求进行改写或开发&#xff0c;此…

Echarts使用,大数据量时,折线图曲线Y轴取值刻度不正确

如下图&#xff0c;当数据量过大时&#xff0c;会出现数值对应Y轴刻度显示不正确问题。 ​​​​​​​ 可检查配置项是否存在sampling字段 option {series: [{data: [...],type: line,smooth: true,symbolSize: 0,sampling: "average", // 注意此行}] }; samplin…

android 中颜色的基础知识

一.简单介绍Android中的颜色 安卓支持的颜色模式&#xff1a; PS&#xff1a;其中字母表示通道类型&#xff0c;数值表示该类型用多少位二进制来描述。如ARGB8888则表示有四个通道(ARGB),每个对应的通道均用8位来描述。 注意&#xff1a;我们常用的是ARGB8888和ARGB4444&am…

java 网上二手车销售系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 网上二手车销售系统是一套完善的web设计系统&#xff0c;对理解JSP java SERLVET mvc编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0…

C#ConsoleKey类讲解

大家好&#xff0c;我是华山自控编程朱老师 前几天一个学员在学习C#与ConsoleKey类交互时,对ConsoleKey提取的键盘字符有些疑惑 。下面我们就详细讲讲C# 和ConsoleKey交互的相关知识。 C#和ConsoleKey是编程领域中重要的概念和工具之一。C#是一种通用的、面向对象的编程语言&…

【优选算法】—— 双指针问题

从今天开始&#xff0c;整个暑假期间。我将不定期给大家带来有关各种算法的题目&#xff0c;帮助大家攻克面试过程中可能会遇到的算法这一道难关。 目录 &#xff08;一&#xff09; 基本概念 &#xff08;二&#xff09;题目讲解 1、难度&#xff1a;easy 1️⃣移动零 2️…

数据结构——二叉树的实现

什么是二叉树&#xff1f; 二叉树&#xff08;binary tree&#xff09;是指树中节点的度不大于2的有序树&#xff0c;它是一种最简单且最重要的树。二叉树的递归定义为&#xff1a;二叉树是一棵空树&#xff0c;或者是一棵由一个根节点和两棵互不相交的&#xff0c;分别称作根…