Java提供了事件机制,在使用spring的时候,我们可以把普通的java事件操作定义为bean集成到bean容器中,但还有一种更方便的方式,即使用spring已集成的事件支持。
在使用Spring的事件支持时,我们需要关注以下几个对象:
1. ApplicationEvent:继承自EventObject,同时是spring的application中事件的父类,需要被自定义的事件继承。
2. ApplicationListener:继承自EventListener,spring的application中的监听器必须实现的接口,需要被自定义的监听器实现其onApplicationEvent方法
3. ApplicationEventPublisherAware:在spring的context中希望能发布事件的类必须实现的接口,该接口中定义了设置ApplicationEventPublisher的方法,由ApplicationContext调用并设置。在自己实现的ApplicationEventPublisherAware子类中,需要有ApplicationEventPublisher属性的定义。
4. ApplicationEventPublisher:spring的事件发布者接口,定义了发布事件的接口方法publishEvent。因为ApplicationContext实现了该接口,因此spring的ApplicationContext实例具有发布事件的功能(publishEvent方法在AbstractApplicationContext中有实现)。在使用的时候,只需要把ApplicationEventPublisher的引用定义到ApplicationEventPublisherAware的实现中,spring容器会完成对ApplicationEventPublisher的注入。
在spring的bean配置中,因为事件是由事件源发出的,不需要注册为bean由spring容器管理。所以在spring的配置中,只需配置自定义的ApplicationEventListener和publisherAware(即实现了ApplicationEventPublisherAware接口的发布类),而对于ApplicationEventPublisher的管理和注入都由容器来完成。
基于spring的事件简单实现如下:
1. 定义ApplicationEvent
package com.nuc.event;
import org.springframework.context.ApplicationEvent;
/**
* 定义Spring容器中的事件,与java普通的事件定义相比,只是继承的父类不同而已,在
* 在定义上并未有太大的区别,毕竟ApplicationEvent也是继承自EventObject的。
*/
public class MethodExecutionEvent extends ApplicationEvent {
private static final long serialVersionUID = 2565706247851725694L;
private String methodName;
private MethodExecutionStatus methodExecutionStatus;
public MethodExecutionEvent(Object source) {
super(source);
}
public MethodExecutionEvent(Object source, String methodName, MethodExecutionStatus methodExecutionStatus) {
super(source);
this.methodName = methodName;
this.methodExecutionStatus = methodExecutionStatus;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public MethodExecutionStatus getMethodExecutionStatus() {
return methodExecutionStatus;
}
public void setMethodExecutionStatus(MethodExecutionStatus methodExecutionStatus) {
this.methodExecutionStatus = methodExecutionStatus;
}
}
2. 定义ApplicationEventListener
package com.nuc.listener;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import com.nuc.event.MethodExecutionEvent;
import com.nuc.event.MethodExecutionStatus;
/**
* Spring容器中的事件监听器,与java中基本的事件监听器的定义相比,这里需要实现ApplicationListener接口
* ApplicationListener接口虽然继承自EventListener,但扩展了EventListener
* 它在接口声明中定义了onApplicationEvent的接口方法,而不像EventListener只作为标记性接口。
*/
public class MethodExecutionEventListener implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof MethodExecutionEvent) {
if (MethodExecutionStatus.BEGIN
.equals(((MethodExecutionEvent) event)
.getMethodExecutionStatus())) {
System.out.println("It's beginning");
}
if (MethodExecutionStatus.END.equals(((MethodExecutionEvent) event).getMethodExecutionStatus())) {
System.out.println("It's ending");
}
}
}
}
3. 定义ApplicationEventPublisherAware
package com.nuc.publisher;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import com.nuc.event.MethodExecutionEvent;
import com.nuc.event.MethodExecutionStatus;
public class MethodExecutionEventPublisher implements
ApplicationEventPublisherAware {
private ApplicationEventPublisher eventPublisher;
public void methodToMonitor() {
MethodExecutionEvent beginEvent = new MethodExecutionEvent(this, "methodToMonitor", MethodExecutionStatus.BEGIN);
this.eventPublisher.publishEvent(beginEvent);
//TODO
MethodExecutionEvent endEvent = new MethodExecutionEvent(this, "methodToMonitor", MethodExecutionStatus.END);
this.eventPublisher.publishEvent(endEvent);
}
public void setApplicationEventPublisher(
ApplicationEventPublisher applicationEventPublisher) {
this.eventPublisher = applicationEventPublisher;
}
}
4. 定义bean配置
<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
default-autowire="byName">
<bean id="methodExecListener" class="com.nuc.listener.MethodExecutionEventListener"></bean>
<bean id="evtPublisher" class="com.nuc.publisher.MethodExecutionEventPublisher"></bean>
</beans>
5. 使用事件
package com.nuc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.nuc.publisher.MethodExecutionEventPublisher;
public class App
{
public static void main( String[] args )
{
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MethodExecutionEventPublisher publisher = (MethodExecutionEventPublisher)context.getBean("evtPublisher");
publisher.methodToMonitor();
}
}
从实现来上,和使用基本的java事件流程大体一致,不同的是这里不需要自定义发布者,而使用spring实现提供的事件发布实现。当然,这里却引入了ApplicationEventPublisherAware。
分享到:
相关推荐
主要介绍了使用Spring事件机制实现异步的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
NULL 博文链接:https://xls9577087.iteye.com/blog/2121752
Spring 事件机制代码,有效解决了软件之间的耦合 学习项目代码
Spring框架作为Java开发的核心,其事件监听机制是理解和利用Spring的关键要素之一。这种机制基于观察者模式,由事件(ApplicationEvent)、事件监听器(ApplicationListener)和事件广播器...
Spring事件监听机制
对spring代理机制的实现和原理的详细讲解
如何通过spring自己的缓存机制缓存方法和数据,使系统性能更高!
spring传播机制个人学习
讲述spring事务机制,aopafter,aopbefore,aopmethodintercept,4个例子
希望大家看完这篇文章后能对Spring有更深入的了解,希望这篇文章对你有所帮助
全面的Spring 核心机制 依赖注入 的描述,运用,实例开发运用,
Spring ApplicationContext 事件机制
spring 事件机制(观察者模式)
Spring AOP的实现机制中文版,动态代理及原理,自定义类加载器
微信支付-简单易用 & Spring ...使用 spring 事件机制封装了微信支付通知,以简化使用方式。wiremock 是一个 web mock server,配置中可配置微信 API 的 basePath, 所以你可以使用 wiremock 构建一个完全的仿真环境。
Spring Security以前叫做acegi,是后来才成为Spring的一个子项目,也是目前最为流行的一个安全权限管理框架,它与Spring紧密结合在一起。 Spring Security关注的重点是在企业应用安全层为您提供服务,你将发现业务...
spring安全机制demo 暂时还不能用 但是可以看出思路 入门
SpringIOC和AOP实现机制模拟,来自与网络。
【免费】深入描述spring的事务处理机制,很不错的资源。
主要介绍了JAVA Spring 中的事件机制的相关资料,文中示例代码非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下