文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

基于SpringBoot怎么应用ApplicationEvent

2023-07-05 11:10

关注

这篇文章主要介绍“基于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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯