基于Spring Boot应用ApplicationEvent案例场景

作者:zhangbeizhen18 时间:2023-08-17 22:38:12 

记录:276

场景:利用Spring的机制发布ApplicationEvent和监听ApplicationEvent。

版本:Spring Boot 2.6.3

一、案例场景

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

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

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

二、使用类

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
@Component
public 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
@NoArgsConstructor
public class OrderInfo {
 private String userName;
 private String tradeName;
 private String receiveTime;
}

4.3 ResultObj

ResultObj,restful返回通用对象。

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public 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 日志

输出日志:

基于Spring Boot应用ApplicationEvent案例场景

 以上,感谢。

来源:https://blog.csdn.net/zhangbeizhen18/article/details/125347511

标签:Spring,Boot,ApplicationEvent
0
投稿

猜你喜欢

  • Mybatis plus通用字段自动填充的示例

    2022-10-27 02:05:27
  • C# 键盘Enter键取代Tab键实现代码

    2022-11-21 08:53:14
  • java使用Socket实现SMTP协议发送邮件

    2022-06-08 19:25:50
  • mac系统下载、安装、使用Java8教程

    2023-07-06 04:54:38
  • Java实现简单的抽牌游戏

    2022-10-06 11:55:01
  • android中NFC读写功能的实现方法

    2023-10-19 12:30:07
  • C#开发微信门户及应用(5) 用户分组信息管理

    2022-08-03 04:52:20
  • synchronized及JUC显式locks 使用原理解析

    2023-08-05 03:28:41
  • jvm垃圾回收之GC调优工具分析详解

    2023-08-17 12:40:20
  • android 照相功能的简单实例

    2023-08-08 01:11:55
  • Android自定义wheelview实现滚动日期选择器

    2021-11-22 16:04:19
  • c#单例模式(Singleton)的6种实现

    2021-07-01 10:17:51
  • Unity使用多态制作计算器功能

    2022-10-15 02:50:06
  • 解决SpringMVC项目连接RabbitMQ出错的问题

    2022-12-22 13:05:51
  • Java多线程实现复制文件

    2023-03-21 07:54:17
  • C#基于NPOI生成具有精确列宽行高的Excel文件的方法

    2022-12-18 13:32:46
  • springmvc接收json串,转换为实体类List方法

    2023-07-28 12:40:00
  • springboot v2.0.3版本多数据源配置方法

    2023-07-27 06:37:57
  • Android自定义控件ListView下拉刷新的代码

    2023-04-07 23:51:06
  • Java中缀表达式转后缀表达式实现方法详解

    2021-08-25 02:57:20
  • asp之家 软件编程 m.aspxhome.com