spring中的事件监听eventListener

spring中的事件监听eventListener,第1张

title: spring中的事件监听eventListener

date: 2017-04-20 14:00:59

tags:

category: spring

官网说明: >

事件:当用户在界面上执行一个 *** 作,例如按下键盘、拖动或者单击鼠标时,都将产生一个事件。Java中事件是用来描述不同类型用户 *** 作的对象,Java中有很多不同类型的事件。例如:单击,双击,右击,拖动,键盘的按下、释放,文本域内容改变等。

事件源:产生事件的组件就是一个事件源。例如,当在一个Button上单击鼠标是,将产生一个ActionEvent类型的事件,而这个Button就是事件源

事件监听器:就是调用事件处理方法的对象。当界面 *** 作事件产生并被发送到产生事件的组件时,该组件将把事件发送给能接受和处理该事件的监听器。

事件监听器其实是观察者模式的一种实现

Subject为抽象主题接口定义了主题类中对 观察者列表 的一系列 *** 作, 包括增

Concretes Subject为具体主题类,实现抽象主题接口,在这个类中我们需要先定义一个Observers列表,并对接口中的方法进行重写,在实现notifaObservers方法时,通过迭代的方式调用list中每一个observer的update方法。这里注意notifyObservers中的 同步块 。在多线程的情况下, 为了避免主题类发布通知时, 其他线程对观察者列表的增删 *** 作,  同步块 中用一个 临时List 来获取当前的观察者列表。

Observer为抽象观察者接口,定义了 观察者 对主题类更新状态接受 *** 作

ConcreteObserver为具体观察者类,实现观察者接口更新主题类通知等逻辑

事件监听器的逻辑结构如图所示

观察者(Observer)相当于事件监听者,被观察者(Observable)或者说主题(Subject)相当于事件源和事件,执行逻辑时通知observer即可触发oberver的update,同时可传被观察者和参数。

EventListener为事件监听器的父类接口

IntentListener接口继承了EventListener接口,并制定监听的对象为IntentEvent

IntentManager继承了父类AbstractListenerManager,AbstractListenerManager相当于事件源,在这里实现了注册listener,移除listener和post方法。在这里,nofity方法相当于post,当出现intent event,intentManager负责调用通知eventDispatcher,再由eventDispatcher负责具体事件的分发。

eventDispatcher接口定义了post方法,eventdeliveryService继承了eventdispatcher接口并定义了一个新方法来控制event sink处理event的时间。

coreEventDispatcher类继承了defaultEventSinkRegistry并实现了eventDeverliveryService接口,负责具体事件分发处理。

Java与C#的事件处理都是实现了事件源 事件响应者机制 但又不完全相同 Java实现的是一种事件源与事件响应者两级实体对象方式 这里的事件响应者也是事件监听者 而C#实现的是一种事件源 代理 事件响应者三级实体对象方式 下面就这两种方式来具体说明

Java事件处理

从概念上讲 事件是一种在 源对象 和 监听者对象 之间 某种状态发生变化的传递机制 事件有许多不同的用途 例如在Windows系统中常要处理的鼠标事件 窗口边界改变事件 键盘事件等 在Java中则是定义了一个普通的 可扩充的事件机制 这种机制能够

对事件类型和传递的模型的定义和扩充提供一个公共框架 并适合于广泛的应用

与Java语言和环境有较高的集成度

事件能被描述环境捕获和触发

能使其它构造工具采取某种技术在设计时直接控制事件 以及事件源和事件监听者之间的联系

事件机制本身不依赖于复杂的开发工具

事件从事件源到监听者的传递是通过对目标监听者对象的Java方法调用进行的 对每个明确的事件的发生 都相应地定义一个明确的Java方法 这些方法都集中定义在事件监听者(EventListener)接口中 这个接口要继承java util EventListener 实现了事件监听者接口中一些或全部方法的类就是事件监听者 伴随着事件的发生 相应的状态通常都封装在事件状态对象中 该对象必须继承自java util EventObject 事件状态对象作为单参传递给应响应该事件的监听者方法中 发出某种特定事件的事件源的标识是 遵从规定的设计格式为事件监听者定义注册方法 并接受对指定事件监听者接口实例的引用 有时 事件监听者不能直接实现事件监听者接口 或者还有其它的额外动作时 就要在一个源与其它一个或多个监听者之间插入一个事件适配器类的实例 来建立它们之间的联系

事件状态对象(Event State Object)

与事件发生有关的状态信息一般都封装在一个事件状态对象中 这种对象是java util EventObject的子类 按设计习惯 这种事件状态对象类的名应以Event结尾 例如

public class MouseMovedExampleEvent extends java util EventObject{protected int x y/ 创建一个鼠标移动事件MouseMovedExampleEvent / MouseMovedExampleEvent(java awt Component source Point location){super(source);x = location x;y = location y; } / 获取鼠标位置/ public Point getLocation(){return new Point(x y); }}

事件监听者接口(EventListener Interface)与事件监听者

由于Java事件模型是基于方法调用 因而需要一个定义并组织事件 *** 纵方法的方式 事件 *** 纵方法都被定义在继承了java util EventListener类的EventListener接口中 按规定 EventListener接口的命名要以Listener结尾 任何一个类如果想 *** 纵在EventListener接口中定义的方法都必须以实现这个接口方式进行 这个类也就是事件监听者 例如

/先定义了一个鼠标移动事件对象/public class MouseMovedExampleEvent extends java util EventObject { // 在此类中包含了与鼠标移动事件有关的状态信息  }/定义了鼠标移动事件的监听者接口/interface MouseMovedExampleListener extends java util EventListener { /在这个接口中定义了鼠标移动事件监听者所应支持的方法/ void mouseMoved(MouseMovedExampleEvent mme);}

在接口中只定义方法名 方法的参数和返回值类型 如 上面接口中的mouseMoved方法的具体实现是在下面的ArbitraryObject类中定义的

class ArbitraryObject implements MouseMovedExampleListener { public void mouseMoved(MouseMovedExampleEvent mme){ }}

ArbitraryObject就是MouseMovedExampleEvent事件的监听者

事件监听者的注册与注销

为了各种可能的事件监听者把自己注册入合适的事件源中 建立源与事件监听者间的事件流 事件源必须为事件监听者提供注册和注销的方法 在前面的bound属性介绍中已看到了这种使用过程 在实际中 事件监听者的注册和注销要使用标准的设计格式

public void add< ListenerType>(< ListenerType> listener) public void remove< ListenerType>(< ListenerType> listener)

首先定义了一个事件监听者接口

public interface ModelChangedListener extends java util EventListener { void modelChanged(EventObject e);}

接着定义事件源类

lishixinzhi/Article/program/net/201311/14840

以上就是关于spring中的事件监听eventListener全部的内容,包括:spring中的事件监听eventListener、Springboot——监听器、java中事件,事件源和事件监听器概念,使用事件监听器惊醒事件处理的过程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9531648.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存