spring事件监听机制

事件机制的主要成员:  

  1. 事件
  2. 事件监听器(监听事件触发,处理一些事情)
  3. 事件源(发布事件)

javaSE 提供了一系列自定义事件的标准。

EvenObject,为javaSE提供的事件类型基类,任何自定义事件都必须继承它。

EventListener,为javaSE提供的事件监听器基类,任何自定义事件监听器都得实现。

javaSE未提供事件发布者,由各个应用程序自行实现事件发布者这一角色。

spring提供了ApplicationEventPublisher接口作为事件发布者,并且ApplicationContext接口继承了该接口,担当着事件发布者的角色。但ApplicationContext接口的具体实现各有差异。

spring提供了ApplicationEventMulticaster接口,负责管理ApplicationListener和发布ApplicationEvent。ApplicationContext接口会把事件的相关工作委托给ApplicationEventMulticaster的实现类做,

spring事件机制流程:

  • ApplicationContext发布事件 
//发布事件
context.publishEvent(event);

  实际上是由ApplicationContext的实现AbstractApplicationContext执行发布事件的行为

  • 找到事件广播器,广播事件
getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType);
  • 执行SimpleApplicationEventMulticaster中的multicastEvent方法,调用事件监听器的onApplicationEvent()方法
	@Override
	public void multicastEvent(final ApplicationEvent event, ResolvableType eventType) {
		ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));
		for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) {
			Executor executor = getTaskExecutor();
			if (executor != null) {
				executor.execute(new Runnable() {
					@Override
					public void run() {
						invokeListener(listener, event);
					}
				});
			}
			else {
				invokeListener(listener, event);
			}
		}
	}

  

	protected void invokeListener(ApplicationListener<?> listener, ApplicationEvent event) {
		ErrorHandler errorHandler = getErrorHandler();
		if (errorHandler != null) {
			try {
				doInvokeListener(listener, event);
			}
			catch (Throwable err) {
				errorHandler.handleError(err);
			}
		}
		else {
			doInvokeListener(listener, event);
		}
	}

	@SuppressWarnings({"unchecked", "rawtypes"})
	private void doInvokeListener(ApplicationListener listener, ApplicationEvent event) {
		try {
			listener.onApplicationEvent(event);
		}
		catch (ClassCastException ex) {
			String msg = ex.getMessage();
			if (msg == null || matchesClassCastMessage(msg, event.getClass().getName())) {
				// Possibly a lambda-defined listener which we could not resolve the generic event type for
				// -> let‘s suppress the exception and just log a debug message.
				Log logger = LogFactory.getLog(getClass());
				if (logger.isDebugEnabled()) {
					logger.debug("Non-matching event type for listener: " + listener, ex);
				}
			}
			else {
				throw ex;
			}
		}
	}

  

自定义事件Demo

  • 自定义事件

    

package com.spring.event.event;

import org.springframework.context.ApplicationEvent;

import com.spring.event.bean.Notify;

/**
 * 自定义事件
 * @author sxq
 * @time 2018年8月31日 上午10:26:24
 *
 */
public class NotifyEvent extends ApplicationEvent {

	private int version;

	private Notify notify;
	public int getVersion() {
		return version;
	}

	public void setVersion(int version) {
		this.version = version;
	}

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = -6198589267233914254L;

	public NotifyEvent(Object source) {
		super(source);

	}
	public Notify getNotify() {
		return notify;
	}

	public void setNotify(Notify notify) {
		this.notify = notify;
	}

	public NotifyEvent(Object source,Notify notify) {
		this(source);
		this.notify = notify;

	}

}

  

  • 自定义监听器
package com.spring.event.listner;

import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

import com.spring.event.event.NotifyEvent;

/**
 * 自定义监听器
 * @author sxq
 * @time 2018年8月31日 上午10:27:04
 *
 */
@Component
public class NotifyListenr implements ApplicationListener<NotifyEvent>{

	@Override
	public void onApplicationEvent(NotifyEvent event) {

		System.out.println(event.getNotify().toString());

		//监听事件后,处理后续事情
	}

}

  

  • 发布
	ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
	Notify notify = new Notify("李四",21);
	NotifyEvent event = new NotifyEvent("NotifyEvent",notify);
	event.setVersion(100);
	//发布事件
     context.publishEvent(event);

  

原文地址:https://www.cnblogs.com/sxqjava/p/9568641.html

时间: 2024-11-05 15:49:10

spring事件监听机制的相关文章

Spring架构揭秘-事件监听机制

一.事件监听机制概述 二.事件监听机制结构 三.Spring监听机制架构 Spring的Application拥有发布事件并且注册事件监听器的能力,拥有一套完整的事件发布和监听机制.在Java中,通过java.util. EventObject来描述事件,通过java.util. EventListener来描述事件监听器,在众多的框架和组件中,建立一套事件机制通常是基于这两个接口来进行扩展. 在一个事件体系中,有以下几个重要的概念. 1.事件源:事件对象的产生者,任何一个EventObject

Java中的事件监听机制

鼠标事件监听机制的三个方面: 1.事件源对象: 事件源对象就是能够产生动作的对象.在Java语言中所有的容器组件和元素组件都是事件监听中的事件源对象.Java中根据事件的动作来区分不同的事件源对象,动作发生在哪个组件上,那么该组件就是事件源对象 2.事件监听方法: addMouseListener(MouseListener ml) ;该方法主要用来捕获鼠标的释放,按下,点击,进入和离开的动作:捕获到相应的动作后,交由事件处理类(实现MouseListener接口)进行处理. addAction

.NET事件监听机制的局限与扩展

.NET中把“事件”看作一个基本的编程概念,并提供了非常优美的语法支持,对比如下C#和Java代码可以看出两种语言设计思想之间的差异. // C#someButton.Click += OnSomeButtonClick; // JavasomeButton.addActionListener( new ActionListener(){ public void actionPerformed(){ ... } }); 在我们的软件中就大量使用事件来对监听者与发布者解耦,但也遇到了一些局限,在这

4.JAVA之GUI编程事件监听机制

事件监听机制的特点: 1.事件源 2.事件 3.监听器 4.事件处理 事件源:就是awt包或者swing包中的那些图形用户界面组件.(如:按钮) 事件:每一个事件源都有自己特点有的对应事件和共性事件.(如:鼠标单击事件) 监听器:将可以触发某一事件的动作(不止一个动作)都已经封装到了监听器中. 以上三者,在java中都已经定义好了,直接获取其对象来用就可以了. 我们要做的事情是,就是对产生的动作进行处理. 图解事件监听机制: 4.JAVA之GUI编程事件监听机制,布布扣,bubuko.com

GUI编程笔记05:GUI事件监听机制原理和举例说明

1.事件监听机制:       A:事件源          事件发生的地方       B:事件             就是要发生的事情       C:事件处理       就是针对发生的事情做出的处理方案       D:事件监听       就是把事件源和事件关联起来 2.举例:人受伤事件. 事件源:人(具体的对象)         Person p1 = new Person("张三");         Person p2 = new Person("李四&qu

关于事件监听机制的总结(Listener和Adapter)

记得以前看过事件监听机制背后也是有一种设计模式的.(设计模式的名字记不清了,只记得背后实现的数据结构是数组.) 附上事件监听机制的分析图: 一个事件源可以承载多个事件(只要这个事件源支持这个事件就可以,男人就不支持生孩子的事件)  事件和监听器有对应关系的. 下面用awt中的标准图形化界面分析: 接口WindowListener 中有一个实现类WindowAdapter类.适配器类. EventListener.java 下面是所有超级接口EventListener.java的源代码   其实就

Java 中的事件监听机制

看项目代码时遇到了好多事件监听机制相关的代码.现学习一下: java事件机制包含三个部分:事件.事件监听器.事件源. 1.事件:继承自java.util.EventObject类,开发人员自己定义. package com.shuyan.javatest.EventTest; import java.util.EventObject; public class DnsEvent extends EventObject { private String userData; private long

JAVA事件监听机制学习

//事件监听机制 import java.awt.*; import java.awt.event.*; public class TestEvent { public static void main(String[] args) { Frame f = new Frame("Test"); Button b = new Button("Press Me!"); Monitor bh = new Monitor(); //实现了某种监听器接口的类的对象 b.add

观察者模式与事件监听机制

一.观察者模式 1.1 概述 有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己.它类似B/S架构模式,构建一个服务端,多个客户端显示.其实这个主题对象就像是一个信息源,当信息源的状态发送变化时,它会通知所有订阅者,使它们进行相应的处理.在百度百科中的例子是,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上. 1