第八節(jié) Hasor 事件

2018-09-28 20:16 更新

雖然 Hasor 提供的 Module 可以幫助您模塊化項目開發(fā)。但是在代碼層面往往多個系統(tǒng)之間還會有直接或者間接的調(diào)用,耦合度還是很高。這個時候您可以適當?shù)氖褂?Hasor 的事件機制來進行深度解耦。使用事件可以為程序的模塊劃清界限,明確了通知者和接受者之間的關(guān)系。同時使用事件還可以增加程序的可維護性和重用性。


Hasor 事件的執(zhí)行分為三種:同步(獨享線程)同步(共享線程)、異步,它們的執(zhí)行模型如下:

Hasor 事件


無論是同步的事件模型,還是異步事件模型。在 Hasor 事件體系中,它們都有以下共同性質(zhì):

  • 1.按注冊順序執(zhí)行事件監(jiān)聽器
  • 2.事件監(jiān)聽器接口相同
  • 3.事件注冊方式相同


后面會有專門的文章分別介紹 Hasor 的各類事件機制差異點。在開始這些內(nèi)容之前,現(xiàn)在先讓我們來看一看如何注冊事件監(jiān)聽器。首先我們先實現(xiàn)一個事件監(jiān)聽器:

import net.hasor.core.EventListener;
public class MyListener implements EventListener<Object> {
    public void onEvent(String event, Object eventData) throws InterruptedException {
        Thread.sleep(500);
        System.out.println("Receive Message:" + JSON.toJSONString(eventData));
    }
}


在 Hasor 中事件的注冊和發(fā)送都是通過 EventContext 發(fā)送出去的。因此您需要首先拿到這個接口對象,才能將事件監(jiān)聽器注冊上。下面是不同的情況下如何取得 EventContext 接口的例子:

ApiBinder apiBinder = ...
EventContext ec = apiBinder.getEnvironment().getEventContext();
AppContext appContext = ...;
EventContext eventContext = appContext.getInstance(EventContext.class);
or
EventContext eventContext = appContext.getEnvironment().getEventContext();
public class MyBean{
    @Inject
    private EventContext eventContext;
}


接著我們通過 EventContext 將事件注冊到容器中。

EventContext eventContext = ...
eventContext.addListener("EventName",new MyListener());


在注冊完畢之后我們可以引發(fā)事件:

eventContext.fireSyncEvent("EventName",...);


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號