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

CDI 事件機制是整個精髓所在的榛,有點類似于觀察者模式
定義一個Room類型 的一個添加房間的事件類型哥谷,名字并不重要棺榔,重要的是類型

    @Inject
    @Add
    Event<Room> roomAddEvent;

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

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

這個時候@Observers修飾的訂閱者就可以接收事件症歇,并執(zhí)行任務(wù)郎笆,并通過@Add這個qualifter來區(qū)別唯一事件類型。

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

動態(tài)注入事件

這樣如果有多個事件就不需要為每個事件都定義一個Qualifter了忘晤。

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

定義一個有條件的觀察者

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

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

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

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

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

訂閱事件時候調(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) { ... }}}

但是下面這個方法不會得到通知宛蚓,因為@Personal沒有包含在事件發(fā)生處

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

事物處理的Event

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

比如下面這個只有事物成功后才會被通知。

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)容合作請聯(lián)系作者
  • 序言:七十年代末设塔,一起剝皮案震驚了整個濱河市凄吏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌闰蛔,老刑警劉巖竞思,帶你破解...
    沈念sama閱讀 210,835評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異钞护,居然都是意外死亡,警方通過查閱死者的電腦和手機爆办,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,900評論 2 383
  • 文/潘曉璐 我一進店門难咕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事余佃∧喝校” “怎么了?”我有些...
    開封第一講書人閱讀 156,481評論 0 345
  • 文/不壞的土叔 我叫張陵爆土,是天一觀的道長椭懊。 經(jīng)常有香客問我,道長步势,這世上最難降的妖魔是什么氧猬? 我笑而不...
    開封第一講書人閱讀 56,303評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮坏瘩,結(jié)果婚禮上盅抚,老公的妹妹穿的比我還像新娘。我一直安慰自己倔矾,他們只是感情好妄均,可當我...
    茶點故事閱讀 65,375評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哪自,像睡著了一般丰包。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上壤巷,一...
    開封第一講書人閱讀 49,729評論 1 289
  • 那天邑彪,我揣著相機與錄音,去河邊找鬼隙笆。 笑死锌蓄,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的撑柔。 我是一名探鬼主播瘸爽,決...
    沈念sama閱讀 38,877評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼铅忿!你這毒婦竟也來了剪决?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,633評論 0 266
  • 序言:老撾萬榮一對情侶失蹤檀训,失蹤者是張志新(化名)和其女友劉穎柑潦,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體峻凫,經(jīng)...
    沈念sama閱讀 44,088評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡渗鬼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,443評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了荧琼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片譬胎。...
    茶點故事閱讀 38,563評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡差牛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出堰乔,到底是詐尸還是另有隱情偏化,我是刑警寧澤,帶...
    沈念sama閱讀 34,251評論 4 328
  • 正文 年R本政府宣布镐侯,位于F島的核電站侦讨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏苟翻。R本人自食惡果不足惜韵卤,卻給世界環(huán)境...
    茶點故事閱讀 39,827評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望袜瞬。 院中可真熱鬧怜俐,春花似錦、人聲如沸邓尤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,712評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汞扎。三九已至季稳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間澈魄,已是汗流浹背景鼠。 一陣腳步聲響...
    開封第一講書人閱讀 31,943評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留痹扇,地道東北人铛漓。 一個月前我還...
    沈念sama閱讀 46,240評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像鲫构,于是被迫代替她去往敵國和親浓恶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,435評論 2 348

推薦閱讀更多精彩內(nèi)容

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