一、首先看一下Spring中的Event。其定义如下:
package org.springframework.context;
import java.util.EventObject;
/**
* Class to be extended by all application events.
* Abstract as it doesn't make sense for generic events
* to be published directly.
*/
public abstract class ApplicationEvent extends EventObject {
/** use serialVersionUID from Spring 1.2 for interoperability */
private static final long serialVersionUID = 7099057708183571937L;
/** System time when the event happened */
private final long timestamp;
/**
* Create a new ApplicationEvent.
* @param source the component that published the event (never <code>null</code>)
*/
public ApplicationEvent(Object source) {
super(source);
this.timestamp = System.currentTimeMillis();
}
/**
* Return the system time in milliseconds when the event happened.
*/
public final long getTimestamp() {
return timestamp;
}
}
这是一个抽象类,定义了Spring中的Event。其构造函数的参数表示事件源。我们可以根据自己的需要定义事件类型,只要继承自ApplicationEvent即可。
public class ActionEvent extends ApplicationEvent {
public ActionEvent(Object source){
super(source);
}
}
二、有了事件,必然要有监听器。这里的监听器为ApplicationListener
还是先看下该类的定义:
package org.springframework.context;
import java.util.EventListener;
/**
* Interface to be implemented by application event listeners.
* Based on the standard <code>java.util.EventListener</code> interface
* for the Observer design pattern.
*/
public interface ApplicationListener extends EventListener {
/**
* Handle an application event.
* @param event the event to respond to
*/
void onApplicationEvent(ApplicationEvent event);
}
此接口只定义了一个方法,即当接收到事件发生的通知时,所需要执行的动作。
可以通过实现此接口来完成用户自定义的监听器:
public class ActionListener implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
if(event instanceof ActionEvent){
System.out.print(event.getSource());
}
}
}
三、有了事件和监听器,那么如何发布这个事件呢?需要了解的是,在Spring中,通过Application接口中的publishEvent()方法可以发布事件。而在普通应用中可以通过实现ApplicationContextAware接口可以轻松的获取ApplicaitonContext的实例。
下面首先来看一下ApplicationContextAware接口的定义:
public interface ApplicationContextAware {
void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}
通常情况下,需要获取较多的bean,或者是需要访问资源文件以及想要发布ApplicationEvent时实现此接口。
用户可以根据需要实现此接口,并在程序中恰当的时候发布事件。
public class LoginAction implements ApplicationContextAware {
private ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext arg0)
throws BeansException {
this.applicationContext = arg0;
}
public int login(String username,String password){
SimpleClass sc = new SimpleClass("1","simpleClass");
ActionEvent actionEvent = new ActionEvent(sc);
this.applicationContext.publishEvent(actionEvent);
return 0;
}
}
四、上面相继给出了事件、监听器及其关系的介绍和简单举例,下面给出简单测试的代码:
public class Test {
public static void main(String[] args) {
ApplicationContext cxt = new ClassPathXmlApplicationContext("applicationContext.xml");
LoginAction action = (LoginAction)cxt.getBean("loginAction");
action.login("prince", "mimamima");
}
}
当发生login动作时,终端会有如下输出:This is SimpleClass。
总结:纵观Spring的事件与监听,其实现相对简单。首先是定义事件(实现ApplicationEvent),接着要定义监听器(实现ApplicationListener接口)。最后,需要发布事件的类要实现ApplicationContextAware接口,并用其中的ApplicationContext的实例发布事件publish(source).