spring 監聽器和事件

一、基礎

觀察者模式

觀察者(Observer)模式又名發佈-訂閱(Publish/Subscribe)模式。GOF給觀察者模式如下定義:定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新。
觀察者
(Observer)將自己註冊到被觀察對象(Subject)中,被觀察對象將觀察者存放在一個容器(Container)裏。
被觀察
被觀察對象發生了某種變化,從容器中得到所有註冊過的觀察者,將變化通知所有觀察者,觀察者們接收變化,如果對該變化感興趣,那麼 進行更新。
撤銷觀察
觀察者告訴被觀察者要撤銷觀察,被觀察者從容器中將觀察者去除。

事件模型

事件是可以被控件識別的操作,如按下確定按鈕,選擇某個單選按鈕或者複選框。每一種控件有自己可以識別的事件,如窗體的加載、單擊、雙擊等事件,文本框的內容改變事件,等等。

事件模型可以使用觀察者模式實現:事件可以作爲作爲觀察者模式中的 被觀察對象的”變化”,觀察者接收所有事件,當對某個事件感興趣時做出變化。

二、Spring中的事件機制

ApplicationListener: 就是我們的Observer,需要到容器中註冊。它要關心它所關心的ApplicationEvent 。一般有如下代碼:

if (event instanceof BlackListEvent) {

}

ApplicationEventMulticaster:是我們Subject的一個代理。它會管理我們的ApplicationListener 。
ApplicationEvent: 是事件,它就是媒介,充當介質的作用。

使用ApplicationEventMulticaster 示例

下面程序中定義了兩個監聽器和兩個事件,開始監聽器只對開始事件作出相應,結束監聽器對結束事件作出響應。

public class Tester {

    public static void main(String[] args) {
        //構建廣播器
        ApplicationEventMulticaster multicaster = new SimpleApplicationEventMulticaster();
        //添加開始監聽器
        multicaster.addApplicationListener(new MyStartListener());
        //添加結束監聽器
        multicaster.addApplicationListener(new MyEndListener());
        System.out.println("---發佈開始事件---");
        multicaster.multicastEvent(new MyStartEvent(""));//廣播開始事件
        System.out.println("---發佈結束事件---");
        multicaster.multicastEvent(new MyEndEvent(""));//廣播結束事件  
    } 

    public static class MyStartEvent extends ApplicationEvent {
        public MyStartEvent(Object source) {
            super(source);
        }
    }

    public static class MyEndEvent extends ApplicationEvent { 
        public MyEndEvent(Object source) {
            super(source);
        }
    }

    public static class MyStartListener implements ApplicationListener {

        @Override
        public void onApplicationEvent(ApplicationEvent event) {
            if (event instanceof MyStartEvent ) {
                System.out.println("[程序開始監聽器]:程序開始!");
            }
        }
    }

    public static class MyEndListener implements ApplicationListener {

        @Override
        public void onApplicationEvent(ApplicationEvent event) {
            if (event instanceof MyEndEvent) {
                System.out.println("[程序結束監聽器]:程序結束!");
            }
        }
    }
}

運行結果:

---發佈開始事件---
[程序開始監聽器]:程序開始!
---發佈結束事件---
[程序結束監聽器]:程序結束!
從這個小例子中可以看出Spring對廣播事件是如何使用的。
我把裏面的日誌改了下。 原文轉自:https://blog.csdn.net/u011179993/article/details/51487865
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章