CDI組件技術(shù)(四)—— 難點(diǎn)event

CDI 事件機(jī)制是整個(gè)精髓所在,有點(diǎn)類似于觀察者模式
定義一個(gè)Room類型 的一個(gè)添加房間的事件類型,名字并不重要,重要的是類型

    @Inject
    @Add
    Event<Room> roomAddEvent;

頁(yè)面上點(diǎn)擊按鈕觸發(fā)事件,事件生產(chǎn)者通過(guò)調(diào)用fire()方法,并傳遞"事件對(duì)象"從而激活事件處理. 。

    /**
     * 入住房間
     *
     * @return 這里利用JSF的特性:返回空字符串或者null表示刷新當(dāng)前頁(yè)面
     */
    public String checkIn(Room room) {
        roomAddEvent.fire(room);
        return null;
    }

這個(gè)時(shí)候@Observers修飾的訂閱者就可以接收事件,并執(zhí)行任務(wù),并通過(guò)@Add這個(gè)qualifter來(lái)區(qū)別唯一事件類型。

    public void onAddRoom(@Observes @Add Room room){
        log.info("add room:{}.",room);
        room.setStatus(RoomStatus.AVAILABLE);
        rooms.add(room);
    }

動(dòng)態(tài)注入事件

這樣如果有多個(gè)事件就不需要為每個(gè)事件都定義一個(gè)Qualifter了。

roomAddEvent.select(new AnnotationLiteral<Add>(){}).fire(Room);

定義一個(gè)有條件的觀察者

默認(rèn)情況下,在當(dāng)前上下文如果沒(méi)有一個(gè)觀察者的實(shí)例,容器將為事件實(shí)例化觀察者.但我們希望傳遞給觀察者的實(shí)例是已經(jīng)存在于上下文中的觀察者.指定一個(gè)有條件的觀察者的方式是在@Observes注釋上添加receive = IF_EXISTS

public void refreshOnDocumentUpdate(@Observes(receive = IF_EXISTS) @Updated Document d) { ... }

為Qualifter設(shè)置成員變量

可以通過(guò)@Qualifter的value值傳遞信息給observer.

@Qualifier
@Target({METHOD, FIELD, PARAMETER, TYPE})
@Retention(RUNTIME)
public @interface Role { 
    RoleType value();
}

訂閱事件時(shí)候調(diào)用

public void adminLoggedIn(@Observes @Role(ADMIN) LoggedIn event) { ... }

多重qualifiers

@Inject @Blog Event<Document> blogEvent;
...
if (document.isBlog()) blogEvent.select(newAnnotationLiteral<Updated>(){}).fire(

下面的觀察者都可以得到通知

public void afterBlogUpdate(@Observes @Updated @Blog Document document) { ... }
public void afterDocumentUpdate(@Observes @Updated Document document) { ... }
public void onAnyBlogEvent(@Observes @Blog Document document) { ... }
public void onAnyDocumentEvent(@Observes Document document) { ... }}}

但是下面這個(gè)方法不會(huì)得到通知,因?yàn)锧Personal沒(méi)有包含在事件發(fā)生處

public void afterPersonalBlogUpdate(@Observes @Updated @Personal @Blog Document document) { ... }

事物處理的Event

1. IN_PROGRESS --- observers被立即通知 (default)
2. AFTER_SUCCESS --- 在事務(wù)成功完成后,observers會(huì)被通知.
3. AFTER_FAILURE --- 在事務(wù)完成失敗后,observers會(huì)被通知.
4. AFTER_COMPLETION --- observers在交易完成后的階段被調(diào)用
5. BEFORE_COMPLETION --- observers在交易完成前階段被調(diào)用

比如下面這個(gè)只有事物成功后才會(huì)被通知。

public void refreshCategoryTree(@Observes(during = AFTER_SUCCESS) CategoryUpdateEvent event) { ... }

參考:
https://my.oschina.net/zhaoqian/blog/265207

示例代碼:
https://github.com/liuqinyi/weld-tutorial
https://github.com/liuqinyi/quickstart.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,694評(píng)論 19 139
  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,656評(píng)論 30 472
  • 什么是Run Loops RunLoops是與線程相關(guān)聯(lián)的基礎(chǔ)部分,一個(gè)Run Loop就是事件處理循環(huán),他是用來(lái)...
    傻傻小蘿卜閱讀 1,111評(píng)論 0 5
  • 點(diǎn)擊查看原文 Web SDK 開(kāi)發(fā)手冊(cè) SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 14,384評(píng)論 0 15
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,323評(píng)論 25 708

友情鏈接更多精彩內(nèi)容