这篇文章主要介绍“基于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”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://blog.csdn.net/zhangbeizhen18/article/details/125347511