1 Mulakan permintaan yang tenang dan terbitkan acara yang berbeza mengikut parameter permintaan.
2. Pendengar acara, selepas mendengar acara, lakukan operasi yang telah ditetapkan.
3. Contoh ini ialah mekanisme pemprosesan penyegerakan acara, iaitu selepas acara diterbitkan, acara akan dipantau secara serentak.
org.springframework.context.ApplicationEvent, objek acara musim bunga.
org.springframework.context.ApplicationListener, antara muka pendengar acara.
org.springframework.context.ApplicationEventPublisher, antara muka penerbit acara.
Objek acara melaksanakan ApplicationEvent.
ExampleApplicationEvent, kelas abstrak. Warisi ApplicationEvent dan sesuaikan serta kembangkan beberapa sifat yang diperlukan dalam perkhidmatan mikro.
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 ialah kelas pelaksanaan kelas abstrak ExampleApplicationEvent, di mana anda boleh mengembangkan atribut mengikut keperluan.
public class ExampleLocalApplicationEvent extends ExampleApplicationEvent { public ExampleLocalApplicationEvent(Object eventData) { super(eventData); } public ExampleLocalApplicationEvent(Object eventData, String eventType) { super(eventData, eventType); } }
EventTypeEnum, penghitungan jenis acara tersuai, dikembangkan atas permintaan.
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; } }
Pendengar acara termasuk antara muka dan kelas abstrak.
IEventListener, antara muka, mewarisi antara muka ApplicationListener.
@SuppressWarnings("rawtypes") public interface IEventListener extends ApplicationListener { }
AbstractEventListener, kelas abstrak, melaksanakan antara muka IEventListener. Dan menyediakan kaedah abstrak untuk memudahkan sambungan kelas dan penyahgandingan kod.
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, melaksanakan kelas abstrak AbstractEventListener. Ia adalah kelas perniagaan untuk mendengar acara dan memprosesnya.
@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()); } }
Pendengar acara termasuk antara muka dan kelas pelaksanaan.
IEventPublisher, antara muka penerbitan acara tersuai untuk memudahkan fungsi dan sifat lanjutan.
public interface IEventPublisher { boolean publish(ExampleApplicationEvent event); }
LocalEventPublisher, kelas pelaksanaan penerbitan acara, kelas ini menggunakan @Component, bekas IOC spring akan memuatkan kelas ini. Kelas ini memanggil publishEvent of ApplicationEventPublisher untuk menerbitkan acara.
@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; } }
Gunakan permintaan yang tenang untuk mencetuskan acara.
EventController, menerima permintaan 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, objek data, dihantar dalam objek acara.
@Data @NoArgsConstructor public class OrderInfo { private String userName; private String tradeName; private String receiveTime; }
ResultObj, restful mengembalikan objek biasa.
@Data @NoArgsConstructor @AllArgsConstructor @Builder public class ResultObj { private String code; private String message; }
Permintaan URL: http://127.0.0.1:8080/server/event/f1
Masukkan Rujukan:
{ "userName": "HangZhou", "tradeName": "Vue进阶教程", "flag": "add" }
Nilai pulangan:
{ "code": "200", "message": "成功" }
Log keluaran:
Atas ialah kandungan terperinci Cara menggunakan ApplicationEvent berdasarkan SpringBoot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!