您好,登錄后才能下訂單哦!
這篇文章主要介紹“基于SpringBoot怎么應用ApplicationEvent”,在日常操作中,相信很多人在基于SpringBoot怎么應用ApplicationEvent問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”基于SpringBoot怎么應用ApplicationEvent”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
1.發起restful請求,根據請求參數發布不同的事件。
2.事件監聽者,監聽到事件后,做預定操作。
3.本例是事件同步處理機制,即發布事件后,會同步監聽事件。
org.springframework.context.ApplicationEvent,spring的事件對象。
org.springframework.context.ApplicationListener,事件監聽者接口。
org.springframework.context.ApplicationEventPublisher,事件發布者接口。
事件對象實現ApplicationEvent。
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; } }
ExampleLocalApplicationEvent,是抽象類ExampleApplicationEvent的實現類,在此處按需拓展屬性。
public class ExampleLocalApplicationEvent extends ExampleApplicationEvent { public ExampleLocalApplicationEvent(Object eventData) { super(eventData); } public ExampleLocalApplicationEvent(Object eventData, String eventType) { super(eventData, eventType); } }
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; } }
事件監聽者包括接口和抽象類。
IEventListener,一個接口,繼承ApplicationListener接口。
@SuppressWarnings("rawtypes") public interface IEventListener extends ApplicationListener { }
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); }
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()); } }
事件監聽者包括接口和實現類。
IEventPublisher,自定義事件發布接口,方便擴展功能和屬性。
public interface IEventPublisher { boolean publish(ExampleApplicationEvent event); }
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; } }
使用Restful請求觸發事件發生。
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(); } }
OrderInfo,數據對象,放入事件對象中傳遞。
@Data @NoArgsConstructor public class OrderInfo { private String userName; private String tradeName; private String receiveTime; }
ResultObj,restful返回通用對象。
@Data @NoArgsConstructor @AllArgsConstructor @Builder public class ResultObj { private String code; private String message; }
URL請求: http://127.0.0.1:8080/server/event/f1
入參:
{ "userName": "HangZhou", "tradeName": "Vue進階教程", "flag": "add" }
返回值:
{ "code": "200", "message": "成功" }
輸出日志:
到此,關于“基于SpringBoot怎么應用ApplicationEvent”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。