Spring 的事件传播机制 是基于观察者模式(Observer)实现的,它可以将 Spring Bean 的改变定义为事件 ApplicationEvent,通过 ApplicationListener 监听 ApplicationEvent 事件,一旦Spring Bean 使用 ApplicationContext.publishEvent( ApplicationEvent event )发布事件后,Spring 容器会通知注册在 bean.xml 中所有 ApplicationListener 接口的实现类,最后 ApplicationListener 接口实现类判断是否响应刚发布出来的 ApplicationEvent 事件。
所以,要使用 Spring 事件传播机制需要以下四点:
1. 建立事件类,继承 ApplicationEvent 父类
2. 建立监听类,实现 ApplicationListener 接口
3. 在配置文件 bean.xml 中注册写好的所有 事件类 和 监听类
4. 需要发布事件的类 要实现 ApplicationContextAware 接口,并获取 ApplicationContext 参数
随后便可以开始使用 Spring 事件传播机制为我们服务:(为了讲解流程的连贯性,续以上步骤来测试)
4.1 在自己编写的需要发布事件的 Action 类中实例化 1 中编写好的事件类,并使用 ApplicationContext.publishEvent 发布事件
5. 通过 Spring 调用 Action 方法,观察输出结果(本文使用 Junit 测试)
以下为1-5步骤的源码:
1. 建立事件类 ActionEvent.java
public class ActionEvent extends ApplicationEvent{
public ActionEvent(Object source) {
super(source);
System.out.println("This is ActionEvent");
}
}
2. 建立监听类 ActionListener1.java、ActionListener2.java
public class ActionListener1 implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
if(event instanceof ActionEvent){
System.out.println("ActionListener1: "+event.toString());
}
}
}
public class ActionListener2 implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
if(event instanceof ActionEvent){
System.out.println("ActionListener2: "+event.toString());
}
}
}
3. 在 bean.xml 中注册事件类和监听类
<bean id="loginaction" class="com.ayali.action.LoginAction"/>
<bean id="listener1" class="com.ayali.action.ActionListener1"/>
<bean id="listener2" class="com.ayali.action.ActionListener2"/>
4. 编写 需要发布事件的 loginAction.java
public class LoginAction implements ApplicationContextAware{
private ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext = applicationContext;
}
public void login(String username, String password){
ActionEvent event = new ActionEvent(username);
this.applicationContext.publishEvent(event);
}
}
5. 编写测试方法
public void testActionListener(){
ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");
LoginAction loginAction = (LoginAction) ctx.getBean("loginaction");
loginAction.login("jack", "123");
}
输出结果为:
This is ActionEvent
ActionListener1:com.ayali.action.ActionEvent[source=jack]
ActionListener2:com.ayali.action.ActionEvent[source=jack]
End .