我的编程空间,编程开发者的网络收藏夹
学习永远不晚

基于SpringBoot怎么应用ApplicationEvent

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

基于SpringBoot怎么应用ApplicationEvent

这篇文章主要介绍“基于SpringBoot怎么应用ApplicationEvent”,在日常操作中,相信很多人在基于SpringBoot怎么应用ApplicationEvent问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”基于SpringBoot怎么应用ApplicationEvent”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、案例场景

发起restful请求,根据请求参数发布不同的事件。

事件监听者,监听到事件后,做预定操作。

本例是事件同步处理机制,即发布事件后,会同步监听事件。

二、使用类

org.springframework.context.ApplicationEvent,spring的事件对象。

org.springframework.context.ApplicationListener,事件监听者接口。

org.springframework.context.ApplicationEventPublisher,事件发布者接口。

三、代码

1.事件对象

事件对象实现ApplicationEvent。

1.1 ExampleApplicationEvent

ExampleApplicationEvent,一个抽象类。继承ApplicationEvent,自定义拓展微服务中需求的一些属性。

public abstract class ExampleApplicationEvent extends ApplicationEvent {  private static final String eventSource = "Example";  private String eventType = null;  private Object eventData = null;  public ExampleApplicationEvent(Object eventData) {      super(eventSource);      this.eventData = eventData;  }  public ExampleApplicationEvent(Object eventData, String eventType) {      super(eventSource);      this.eventData = eventData;      this.eventType = eventType;  }  public String getEventType() {      return eventType;  }  public Object getEventData() {      return eventData;  }}
1.2 ExampleLocalApplicationEvent

ExampleLocalApplicationEvent,是抽象类ExampleApplicationEvent的实现类,在此处按需拓展属性。

public class ExampleLocalApplicationEvent extends ExampleApplicationEvent {  public ExampleLocalApplicationEvent(Object eventData) {      super(eventData);  }  public ExampleLocalApplicationEvent(Object eventData, String eventType) {      super(eventData, eventType);  }}
1.3 EventTypeEnum

EventTypeEnum,自定义事件类型枚举,按需扩展。

public enum EventTypeEnum {  CHANGE("change", "变更事件"),  ADD("add", "新增事件");  private String id;  private String name;  public String getId() {   return id;  }  public String getName() {   return name;  }  EventTypeEnum(String id, String name) {   this.id = id;   this.name = name;  }  public static EventTypeEnum getEventTypeEnum(String id) {   for (EventTypeEnum var : EventTypeEnum.values()) {       if (var.getId().equalsIgnoreCase(id)) {           return var;       }   }   return null;  }}

2.事件监听者

事件监听者包括接口和抽象类。

2.1 IEventListener

IEventListener,一个接口,继承ApplicationListener接口。

@SuppressWarnings("rawtypes")public interface IEventListener extends ApplicationListener {}
2.2 AbstractEventListener

AbstractEventListener,一个抽象类,实现IEventListener接口。并提供抽象方法便于实现类扩展和代码解耦。

public abstract  class AbstractEventListener implements IEventListener { @Override public void onApplicationEvent(ApplicationEvent event){  if(!(event instanceof ExampleApplicationEvent)){    return;  }  ExampleApplicationEvent exEvent = (ExampleApplicationEvent) event;  try{    onExampleApplicationEvent(exEvent);  }catch (Exception e){    e.printStackTrace();  } } protected abstract void onExampleApplicationEvent(ExampleApplicationEvent event);}
2.3 OrderEventListener

OrderEventListener,实现类AbstractEventListener抽象类。监听事件,并对事件做处理,是一个业务类。

@Slf4j@Componentpublic class OrderEventListener extends AbstractEventListener {  @Override  protected void onExampleApplicationEvent(ExampleApplicationEvent event) {   log.info("OrderEventListener->onSpApplicationEvent,监听事件.");   Object eventData = event.getEventData();   log.info("事件类型: " + EventTypeEnum.getEventTypeEnum(event.getEventType()));   log.info("事件数据: " + eventData.toString());  }}

3.事件发布者

事件监听者包括接口和实现类。

3.1 IEventPublisher

IEventPublisher,自定义事件发布接口,方便扩展功能和属性。

public interface IEventPublisher {    boolean publish(ExampleApplicationEvent event);}
3.2 LocalEventPublisher

LocalEventPublisher,事件发布实现类,此类使用@Component,spring的IOC容器会加载此类。此类调用ApplicationEventPublisher的publishEvent发布事件。

@Slf4j@Component("localEventPublisher")public class LocalEventPublisher implements IEventPublisher {  @Override  public boolean publish(ExampleApplicationEvent event) {    try{      log.info("LocalEventPublisher->publish,发布事件.");      log.info("事件类型: " + EventTypeEnum.getEventTypeEnum(event.getEventType()));      log.info("事件数据: " + event.getEventData().toString());      SpringUtil.getApplicationContext().publishEvent(event);    }catch (Exception e){      log.info("事件发布异常.");      e.printStackTrace();      return false;    }    return true;  }}

4.Restful请求触发事件

使用Restful请求触发事件发生。

4.1 EventController

EventController,接收Restful请求。

@Slf4j@RestController@RequestMapping("/event")public class EventController {  @Autowired  private LocalEventPublisher eventPublisher;  @PostMapping("/f1")  public Object f1(@RequestBody Object obj) {   log.info("EventController->f1,接收参数,obj = " + obj.toString());   Map objMap = (Map) obj;   OrderInfo orderInfo = new OrderInfo();   orderInfo.setUserName((String) objMap.get("userName"));   orderInfo.setTradeName((String) objMap.get("tradeName"));   orderInfo.setReceiveTime(DateUtil.format(new Date(),           "yyyy-MM-dd HH:mm:ss"));   String flag = (String) objMap.get("flag");   if (StringUtils.equals("change", flag)) {       eventPublisher.publish(new ExampleLocalApplicationEvent(orderInfo,               EventTypeEnum.CHANGE.getId()));   } else if (StringUtils.equals("add", flag)) {       eventPublisher.publish(new ExampleLocalApplicationEvent(orderInfo,               EventTypeEnum.ADD.getId()));   } else {       eventPublisher.publish(new ExampleLocalApplicationEvent(orderInfo));   }   log.info("EventController->f1,返回.");   return ResultObj.builder().code("200").message("成功").build();  }}
4.2 OrderInfo

OrderInfo,数据对象,放入事件对象中传递。

@Data@NoArgsConstructorpublic class OrderInfo {  private String userName;  private String tradeName;  private String receiveTime;}
4.3 ResultObj

ResultObj,restful返回通用对象。

@Data@NoArgsConstructor@AllArgsConstructor@Builderpublic class ResultObj {    private String code;    private String message;}

5.测试

5.1 请求信息

URL请求: http://127.0.0.1:8080/server/event/f1

入参:

{    "userName": "HangZhou",    "tradeName": "Vue进阶教程",    "flag": "add"}

返回值:

{    "code": "200",    "message": "成功"}
5.2 日志

输出日志:

基于SpringBoot怎么应用ApplicationEvent

到此,关于“基于SpringBoot怎么应用ApplicationEvent”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

基于SpringBoot怎么应用ApplicationEvent

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

基于SpringBoot怎么应用ApplicationEvent

这篇文章主要介绍“基于SpringBoot怎么应用ApplicationEvent”,在日常操作中,相信很多人在基于SpringBoot怎么应用ApplicationEvent问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希
2023-07-05

基于SpringBoot应用ApplicationEvent案例场景

这篇文章主要介绍了基于SpringBoot应用ApplicationEvent,利用Spring的机制发布ApplicationEvent和监听ApplicationEvent,需要的朋友可以参考下
2023-03-09

SpringBoot中ApplicationEvent和ApplicationListener怎么使用

本篇内容主要讲解“SpringBoot中ApplicationEvent和ApplicationListener怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot中App
2023-07-05

基于Maven怎么安装SpringBoot

这篇“基于Maven怎么安装SpringBoot”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“基于Maven怎么安装Spri
2023-06-29

怎么轻松搭建基于Serverless的Go应用

怎么轻松搭建基于Serverless的Go应用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先介绍下在本文出现的几个比较重要的概念:函数计算(Function Compu
2023-06-04

springboot ErrorPageFilter怎么应用

本篇内容主要讲解“springboot ErrorPageFilter怎么应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot ErrorPageFilter怎么应用”吧!Er
2023-06-29

基于原生JavaScript怎么实现SPA单页应用

这篇文章主要介绍“基于原生JavaScript怎么实现SPA单页应用”,在日常操作中,相信很多人在基于原生JavaScript怎么实现SPA单页应用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”基于原生Jav
2023-07-05

基于RethinkDB +React Native怎么开发Web应用程序

这篇文章主要讲解了“基于RethinkDB +React Native怎么开发Web应用程序”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于RethinkDB +React Native怎
2023-06-17

怎么开发基于Netty的HTTP/HTTPS应用程序

这篇文章主要介绍“怎么开发基于Netty的HTTP/HTTPS应用程序”,在日常操作中,相信很多人在怎么开发基于Netty的HTTP/HTTPS应用程序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么开发基
2023-06-20

基于 Docker 开发 NodeJS 应用

有关这个 Node 应用 此应用包含一个 package.json, server.js 以及一个 .gitignore 文件, 它们简单到可以信手拈来. .gitignorenode_modules/*package.json{"name
2022-06-04

python怎么应用于数据的基础统计分析

小编给大家分享一下python怎么应用于数据的基础统计分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最初的设计是用于编
2023-06-14

基于python怎么使用PyScript

本文小编为大家详细介绍“基于python怎么使用PyScript”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于python怎么使用PyScript”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。作用PyScr
2023-07-02

SpringBoot怎么集成EasyExcel应用

这篇文章主要讲解了“SpringBoot怎么集成EasyExcel应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot怎么集成EasyExcel应用”吧!1、介绍特点:1、
2023-06-08

Springboot基于BCrypt非对称加密字符串怎么实现

这篇文章主要讲解了“Springboot基于BCrypt非对称加密字符串怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Springboot基于BCrypt非对称加密字符串怎么实现”吧
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录