cari
RumahJavajavaTutorialCara menggunakan ApplicationEvent berdasarkan SpringBoot

Cara menggunakan ApplicationEvent berdasarkan SpringBoot

May 14, 2023 pm 10:01 PM
springbootapplicationevent

1. Senario kes

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.

2. Gunakan kelas

org.springframework.context.ApplicationEvent, objek acara musim bunga.

org.springframework.context.ApplicationListener, antara muka pendengar acara.

org.springframework.context.ApplicationEventPublisher, antara muka penerbit acara.

3. Kod

1. Objek acara

Objek acara melaksanakan ApplicationEvent.

1.1 ExampleApplicationEvent

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;
  }
}
1.2 ExampleLocalApplicationEvent

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);
  }
}
1.3 EventTypeEnum

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;
  }
}

2. Pendengar acara

Pendengar acara termasuk antara muka dan kelas abstrak.

2.1 IEventListener

IEventListener, antara muka, mewarisi antara muka ApplicationListener.

@SuppressWarnings("rawtypes")
public interface IEventListener extends ApplicationListener {
}
2.2 AbstractEventListener

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);
}
2.3 OrderEventListener

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());
  }
}

3. Penerbit acara

Pendengar acara termasuk antara muka dan kelas pelaksanaan.

3.1 IEventPublisher

IEventPublisher, antara muka penerbitan acara tersuai untuk memudahkan fungsi dan sifat lanjutan.

public interface IEventPublisher {
    boolean publish(ExampleApplicationEvent event);
}
3.2 LocalEventPublisher

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;
  }
}

4. Permintaan yang tenang mencetuskan acara

Gunakan permintaan yang tenang untuk mencetuskan acara.

4.1 EventController

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();
  }
}
4.2 OrderInfo

OrderInfo, objek data, dihantar dalam objek acara.

@Data
@NoArgsConstructor
public class OrderInfo {
  private String userName;
  private String tradeName;
  private String receiveTime;
}
4.3 ResultObj

ResultObj, restful mengembalikan objek biasa.

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ResultObj {
    private String code;
    private String message;
}

5 Ujian

5.1 Minta maklumat

Permintaan URL: http://127.0.0.1:8080/server/event/f1

Masukkan Rujukan:

{
    "userName": "HangZhou",
    "tradeName": "Vue进阶教程",
    "flag": "add"
}

Nilai pulangan:

{
    "code": "200",
    "message": "成功"
}
5.2 Log

Log keluaran:

Cara menggunakan ApplicationEvent berdasarkan SpringBoot

Atas ialah kandungan terperinci Cara menggunakan ApplicationEvent berdasarkan SpringBoot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Artikel ini dikembalikan pada:亿速云. Jika ada pelanggaran, sila hubungi admin@php.cn Padam

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

MinGW - GNU Minimalis untuk Windows

MinGW - GNU Minimalis untuk Windows

Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

mPDF

mPDF

mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa