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

猜你喜欢

转载自blog.csdn.net/baofengyu90/article/details/86623541