最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Spring Boot應用ApplicationEvent案例場景

 更新時間:2023年03月09日 15:15:03   作者:zhangbeizhen18  
這篇文章主要介紹了基于Spring Boot應用ApplicationEvent,利用Spring的機制發(fā)布ApplicationEvent和監(jiān)聽ApplicationEvent,需要的朋友可以參考下

記錄:276

場景:利用Spring的機制發(fā)布ApplicationEvent和監(jiān)聽ApplicationEvent。

版本:Spring Boot 2.6.3

一、案例場景

1.發(fā)起restful請求,根據(jù)請求參數(shù)發(fā)布不同的事件。

2.事件監(jiān)聽者,監(jiān)聽到事件后,做預定操作。

3.本例是事件同步處理機制,即發(fā)布事件后,會同步監(jiān)聽事件。

二、使用類

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

org.springframework.context.ApplicationListener,事件監(jiān)聽者接口。

org.springframework.context.ApplicationEventPublisher,事件發(fā)布者接口。

三、代碼

1.事件對象

事件對象實現(xiàn)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的實現(xiàn)類,在此處按需拓展屬性。

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.事件監(jiān)聽者

事件監(jiān)聽者包括接口和抽象類。

2.1 IEventListener

IEventListener,一個接口,繼承ApplicationListener接口。

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

2.2 AbstractEventListener

AbstractEventListener,一個抽象類,實現(xiàn)IEventListener接口。并提供抽象方法便于實現(xiàn)類擴展和代碼解耦。

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,實現(xiàn)類AbstractEventListener抽象類。監(jiān)聽事件,并對事件做處理,是一個業(yè)務類。

@Slf4j
@Component
public class OrderEventListener extends AbstractEventListener {
  @Override
  protected void onExampleApplicationEvent(ExampleApplicationEvent event) {
   log.info("OrderEventListener->onSpApplicationEvent,監(jiān)聽事件.");
   Object eventData = event.getEventData();
   log.info("事件類型: " + EventTypeEnum.getEventTypeEnum(event.getEventType()));
   log.info("事件數(shù)據(jù): " + eventData.toString());
  }
}

3.事件發(fā)布者

事件監(jiān)聽者包括接口和實現(xiàn)類。

3.1 IEventPublisher

IEventPublisher,自定義事件發(fā)布接口,方便擴展功能和屬性。

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

3.2 LocalEventPublisher

LocalEventPublisher,事件發(fā)布實現(xiàn)類,此類使用@Component,spring的IOC容器會加載此類。此類調(diào)用ApplicationEventPublisher的publishEvent發(fā)布事件。

@Slf4j
@Component("localEventPublisher")
public class LocalEventPublisher implements IEventPublisher {
  @Override
  public boolean publish(ExampleApplicationEvent event) {
    try{
      log.info("LocalEventPublisher->publish,發(fā)布事件.");
      log.info("事件類型: " + EventTypeEnum.getEventTypeEnum(event.getEventType()));
      log.info("事件數(shù)據(jù): " + event.getEventData().toString());
      SpringUtil.getApplicationContext().publishEvent(event);
    }catch (Exception e){
      log.info("事件發(fā)布異常.");
      e.printStackTrace();
      return false;
    }
    return true;
  }
}

4.Restful請求觸發(fā)事件

使用Restful請求觸發(fā)事件發(fā)生。

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,接收參數(shù),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,數(shù)據(jù)對象,放入事件對象中傳遞。

@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

入?yún)ⅲ?/p>

{
    "userName": "HangZhou",
    "tradeName": "Vue進階教程",
    "flag": "add"
}

返回值:

{
    "code": "200",
    "message": "成功"
}

5.2 日志

輸出日志:

 以上,感謝。

到此這篇關于基于Spring Boot應用ApplicationEvent的文章就介紹到這了,更多相關Spring Boot應用ApplicationEvent內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解Java的回調(diào)機制

    詳解Java的回調(diào)機制

    最近學習java,接觸到了回調(diào)機制(CallBack)。初識時感覺比較混亂,而且在網(wǎng)上搜索到的相關的講解,本文介紹了Java的回調(diào)機制,有興趣的同學可以了解一下
    2016-10-10
  • Netty中解碼器的作用及實現(xiàn)詳解

    Netty中解碼器的作用及實現(xiàn)詳解

    這篇文章主要介紹了Netty中解碼器的作用及實現(xiàn)詳解,本章我們只需要讓客戶端發(fā)送消息的時候循環(huán)發(fā)送100次,服務端不變,看看服務端是不是接收到了100條消息,需要的朋友可以參考下
    2023-12-12
  • IntelliJ IDEA 老司機居然還沒用過 Stream Trace功能(問題小結)

    IntelliJ IDEA 老司機居然還沒用過 Stream Trace功能(問題小結)

    很多朋友酷愛Java8 Stream功能,但是在使用過程中總不是那么順利,下面通過本文給大家分享idea Stream Trace調(diào)試過程遇到的問題,需要的朋友參考下吧
    2021-05-05
  • @RunWith(SpringJUnit4ClassRunner.class)報錯問題及解決

    @RunWith(SpringJUnit4ClassRunner.class)報錯問題及解決

    這篇文章主要介紹了@RunWith(SpringJUnit4ClassRunner.class)報錯問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Springcloud eureka搭建高可用集群過程圖解

    Springcloud eureka搭建高可用集群過程圖解

    這篇文章主要介紹了Springcloud eureka搭建高可用集群過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Java中將接口返回的字節(jié)串轉為文件詳解

    Java中將接口返回的字節(jié)串轉為文件詳解

    這篇文章主要給大家介紹了關于Java中將接口返回的字節(jié)串轉為文件的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-11-11
  • springboot使用注解獲取yml配置的兩種方法

    springboot使用注解獲取yml配置的兩種方法

    本文主要介紹了springboot使用注解獲取yml配置的兩種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-09-09
  • 基于Spring Boot 排除自動配置的4個方法

    基于Spring Boot 排除自動配置的4個方法

    這篇文章主要介紹了Spring Boot 排除自動配置的4個方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Springboot集成kafka高級應用實戰(zhàn)分享

    Springboot集成kafka高級應用實戰(zhàn)分享

    這篇文章主要介紹了Springboot集成kafka高級應用實戰(zhàn)分享,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • IDEA 2021配置JavaWeb項目超詳細教程

    IDEA 2021配置JavaWeb項目超詳細教程

    本文通過圖文并茂的形式給大家介紹IDEA 2021配置JavaWeb項目的過程,內(nèi)容簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-08-08

最新評論

遂平县| 平乐县| 尚志市| 乐清市| 凌源市| 青铜峡市| 鄢陵县| 漾濞| 宁化县| 蒙山县| 宜君县| 巴里| 临夏县| 驻马店市| 青龙| 高安市| 刚察县| 亳州市| 沧州市| 五台县| 太和县| 揭东县| 永川市| 万州区| 广州市| 嵊泗县| 怀柔区| 斗六市| 高雄市| 扶风县| 南雄市| 西乌珠穆沁旗| 崇州市| 天台县| 宜川县| 永春县| 新和县| 崇明县| 忻城县| 玉龙| 无锡市|