基于Spring Boot應(yīng)用ApplicationEvent案例場(chǎng)景
記錄:276
場(chǎng)景:利用Spring的機(jī)制發(fā)布ApplicationEvent和監(jiān)聽ApplicationEvent。
版本:Spring Boot 2.6.3
一、案例場(chǎng)景
1.發(fā)起restful請(qǐng)求,根據(jù)請(qǐng)求參數(shù)發(fā)布不同的事件。
2.事件監(jiān)聽者,監(jiān)聽到事件后,做預(yù)定操作。
3.本例是事件同步處理機(jī)制,即發(fā)布事件后,會(huì)同步監(jiān)聽事件。
二、使用類
org.springframework.context.ApplicationEvent,spring的事件對(duì)象。
org.springframework.context.ApplicationListener,事件監(jiān)聽者接口。
org.springframework.context.ApplicationEventPublisher,事件發(fā)布者接口。
三、代碼
1.事件對(duì)象
事件對(duì)象實(shí)現(xiàn)ApplicationEvent。
1.1 ExampleApplicationEvent
ExampleApplicationEvent,一個(gè)抽象類。繼承ApplicationEvent,自定義拓展微服務(wù)中需求的一些屬性。
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的實(shí)現(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,自定義事件類型枚舉,按需擴(kuò)展。
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,一個(gè)接口,繼承ApplicationListener接口。
@SuppressWarnings("rawtypes")
public interface IEventListener extends ApplicationListener {
}2.2 AbstractEventListener
AbstractEventListener,一個(gè)抽象類,實(shí)現(xiàn)IEventListener接口。并提供抽象方法便于實(shí)現(xiàn)類擴(kuò)展和代碼解耦。
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,實(shí)現(xiàn)類AbstractEventListener抽象類。監(jiān)聽事件,并對(duì)事件做處理,是一個(gè)業(yè)務(wù)類。
@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)聽者包括接口和實(shí)現(xiàn)類。
3.1 IEventPublisher
IEventPublisher,自定義事件發(fā)布接口,方便擴(kuò)展功能和屬性。
public interface IEventPublisher {
boolean publish(ExampleApplicationEvent event);
}3.2 LocalEventPublisher
LocalEventPublisher,事件發(fā)布實(shí)現(xiàn)類,此類使用@Component,spring的IOC容器會(huì)加載此類。此類調(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請(qǐng)求觸發(fā)事件
使用Restful請(qǐng)求觸發(fā)事件發(fā)生。
4.1 EventController
EventController,接收Restful請(qǐng)求。
@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ù)對(duì)象,放入事件對(duì)象中傳遞。
@Data
@NoArgsConstructor
public class OrderInfo {
private String userName;
private String tradeName;
private String receiveTime;
}4.3 ResultObj
ResultObj,restful返回通用對(duì)象。
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ResultObj {
private String code;
private String message;
}5.測(cè)試
5.1 請(qǐng)求信息
URL請(qǐng)求: http://127.0.0.1:8080/server/event/f1
入?yún)ⅲ?/p>
{
"userName": "HangZhou",
"tradeName": "Vue進(jìn)階教程",
"flag": "add"
}返回值:
{
"code": "200",
"message": "成功"
}5.2 日志
輸出日志:

以上,感謝。
到此這篇關(guān)于基于Spring Boot應(yīng)用ApplicationEvent的文章就介紹到這了,更多相關(guān)Spring Boot應(yīng)用ApplicationEvent內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IntelliJ IDEA 老司機(jī)居然還沒用過 Stream Trace功能(問題小結(jié))
很多朋友酷愛Java8 Stream功能,但是在使用過程中總不是那么順利,下面通過本文給大家分享idea Stream Trace調(diào)試過程遇到的問題,需要的朋友參考下吧2021-05-05
@RunWith(SpringJUnit4ClassRunner.class)報(bào)錯(cuò)問題及解決
這篇文章主要介紹了@RunWith(SpringJUnit4ClassRunner.class)報(bào)錯(cuò)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
Java中將接口返回的字節(jié)串轉(zhuǎn)為文件詳解
這篇文章主要給大家介紹了關(guān)于Java中將接口返回的字節(jié)串轉(zhuǎn)為文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-11-11
基于Spring Boot 排除自動(dòng)配置的4個(gè)方法
這篇文章主要介紹了Spring Boot 排除自動(dòng)配置的4個(gè)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Springboot集成kafka高級(jí)應(yīng)用實(shí)戰(zhàn)分享
這篇文章主要介紹了Springboot集成kafka高級(jí)應(yīng)用實(shí)戰(zhàn)分享,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
IDEA 2021配置JavaWeb項(xiàng)目超詳細(xì)教程
本文通過圖文并茂的形式給大家介紹IDEA 2021配置JavaWeb項(xiàng)目的過程,內(nèi)容簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-08-08

