亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

基于SpringBoot怎么應用ApplicationEvent

發布時間:2023-03-09 16:27:02 來源:億速云 閱讀:131 作者:iii 欄目:開發技術

這篇文章主要介紹“基于SpringBoot怎么應用ApplicationEvent”,在日常操作中,相信很多人在基于SpringBoot怎么應用ApplicationEvent問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”基于SpringBoot怎么應用ApplicationEvent”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一、案例場景

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 日志

輸出日志:

基于SpringBoot怎么應用ApplicationEvent

到此,關于“基于SpringBoot怎么應用ApplicationEvent”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宜兰县| 贵德县| 新田县| 报价| 香格里拉县| 石楼县| 平山县| 积石山| 应用必备| 祁东县| 浮山县| 建瓯市| 平山县| 长丰县| 株洲市| 伽师县| 丽水市| 英山县| 改则县| 西城区| 柏乡县| 新巴尔虎左旗| 开鲁县| 肇源县| 黑河市| 上饶市| 长兴县| 天门市| 松阳县| 黄浦区| 西青区| 宿迁市| 大同县| 思茅市| 鹤山市| 长沙县| 泰顺县| 辽阳市| 融水| 武穴市| 陇西县|