spring中事件機制
阿新 • • 發佈:2019-01-22
一、一些概念
事件是可以被控制元件識別的操作,如按下確定按鈕,選擇某個單選按鈕或者複選框。每一種控制元件有自己可以識別的事件,如窗體的載入、單擊、雙擊等事件,編輯框(文字框)的文字改變事,等等。事件有系統事件和使用者事件。系統事件由系統激發,如時間每隔24小時,銀行儲戶的存款日期增加一天。使用者事件由使用者激發,如使用者點選按鈕,在文字框中顯示特定的文字。事件驅動控制元件執行某項功能。
觸發事件的物件稱為事件傳送者;接收事件的物件稱為事件接收者。
事件模型一般用到了觀察者模式,下面簡單介紹下:
- SUBJECT
- 目標知道它的觀察者。可以有任意多個觀察者觀察同一個目標。
- 提供註冊和刪除觀察者物件的介面。
- Observer(觀察者)
- 為那些在目標發生改變時需獲得通知的物件定義一個更新介面。
- ConcreteSubject(具體目標)
- 將有關狀態存入各ConcreteObserver物件。
- 當它的狀態發生改變時,向它的各個觀察者發出通知。
- ConcreteObserver(具體觀察者)
- 維護一個指向ConcreteSubject物件的引用。
- 儲存有關狀態,這些狀態應與目標的狀態保持一致。
- 實現Observer的更新介面以使自身狀態與目標的狀態保持一致。
二、spring事件機制
首先上圖一張:
- ApplicationListener 就是我們的 Observer,需要到容器中註冊。他要關心他所關心的ApplicationEvent 。一般有如下程式碼:if (event instanceof BlackListEvent) {}
- ApplicationEventMulticaster是我們的SUBJECT一個代理。他會管理我們的 ApplicationListener 。
- ApplicationEvent 是事件,它就是媒介,充當介質的作用。
在spring中,容器管理所有的 bean。是ApplicationEvent 驅動的,一個ApplicationEvent publish了,觀察這個事件的監聽者就會送到通知。
具體核心程式碼如下: ApplicationEventMulticaster 會遍歷所有的 監聽器,再啟動一個執行緒呼叫監聽器的onApplicationEvent方法。
三、例項程式碼
場景:程式發現一個有問題的使用者,再會把這個的使用者記錄下來,採取 事件模型就這樣設計
-
- 發現有問題的使用者
- 把問題記錄下來
- 媒介也就是事件