基于Spring Boot应用ApplicationEvent案例场景
记录:276
场景:利用Spring的机制发布ApplicationEvent和监听ApplicationEvent。
版本:Spring Boot 2.6.3
一、案例场景
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 日志
输出日志:
以上,感谢。
到此这篇关于基于Spring Boot应用ApplicationEvent的文章就介绍到这了,更多相关Spring Boot应用ApplicationEvent内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Jetty启动项目中引用json-lib相关类库报错ClassNotFound的解决方案
今天小编就为大家分享一篇关于Jetty启动项目中引用json-lib相关类库报错ClassNotFound的解决方案,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2018-12-12Springboot FeignClient调用Method has too m
本文主要介绍了Springboot FeignClient微服务间调用Method has too many Body parameters 解决,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2021-12-12SpringBoot+Vue前后端分离实现请求api跨域问题
这篇文章主要介绍了SpringBoot+Vue前后端分离实现请求api跨域问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-06-06SpringSecurity 用户帐号已被锁定的问题及解决方法
这篇文章主要介绍了SpringSecurity 用户帐号已被锁定,本文给大家分享问题原因及解决方式,需要的朋友可以参考下2023-12-12
最新评论