最近看了一下<Spring 开发指南>这本书,在里面看到Spring事件传播的相关内容,觉得比较有用,根据书上再价格自己的理解,完成了一个简单的例子,今天与大家一起来分享一下。
以实例来说话我想大家都容易理解,下面来看例子,有以下几个类:
事件类:ActionEvent.java
事件监听类:ActionListener.java
逻辑处理类:ActionLogic.java
还有一个Bean:PersonBean.java
测试类:TestMain.java
首先来看ActionEvent类:
package com.spring.test;
import org.springframework.context.ApplicationEvent;
public class ActionEvent extends ApplicationEvent{
/**
* serialVersionUID
*/
private static final long serialVersionUID = 646140097162842368L;
public ActionEvent(Object source){
super(source);
}
}
这个类必须继承Spring的 ApplicationEvent,这里做为一个简单的例子,就用构造方法直接调用父类的构造方法就可以了。
ActionListener类
package com.spring.test;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
public class ActionListener implements ApplicationListener{
public void onApplicationEvent(ApplicationEvent event){
if(event instanceof ActionEvent){
PersonBean person = (PersonBean) event.getSource();
System.out.println("Name:" + person.getName());
System.out.println("Password:" + person.getPassword());
}
}
}
事件监听类实现了ApplicationListener接口,必须实现onApplicationEvent方法,在这个方法中,我们可以根据业务要求,根据
applicationContext.publishEvent(event)中发布的不同事件,进行相应的处理。
逻辑处理类ActionLogic
package com.spring.test;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class ActionLogic implements ApplicationContextAware{
private ApplicationContext applicationContext;
/**
* @param applicationContext the applicationContext to set
*/
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public void execute(){
PersonBean person = new PersonBean();
person.setName("fengyun");
person.setPassword("123456");
ActionEvent event = new ActionEvent(person);
this.applicationContext.publishEvent(event);
}
}
必须实现ApplicationContextAware接口,这里最关键就是applicationContext的publishEvent方法,它起到发布事件,通知Listener的目的。
接下来就是简单的PersonBean了,里面只有2个属性,name和password,这里代码就不贴出来了。
测试类:TestMain
package com.spring.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class TestMain {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext ctx = new FileSystemXmlApplicationContext("applicationContext.xml");
ActionLogic logic = (ActionLogic) ctx.getBean("actionLogic");
logic.execute();
}
}
最后就是配置文件了,很简单,只要在applicationContext.xml中定义ActionListener和ActionLogic就可以了。如下所示:
<bean id="actionLogic" class="com.spring.test.ActionLogic"/>
<bean id="listener" class="com.spring.test.ActionListener"/>
运行TestMain就可以看到控制台打出以下结果:
Name:fengyun
Password:123456
我们可以看到,我们运行logic.execute()方法时,自动调用了ActionListener的onApplicationEvent方法。也许我们现在还觉得很奇怪,我们并没有调用ActionListener类啊,这是因为在ApplicationContext会自动在当前所有的Bean中寻找ApplicationListener接口的实现,并将其作为事件接收的对象。当
applicationContext.publishEvent(event)方法调用时,所有的ApplicationListener接口实现都会被激发,在每个ApplicationListener可以根据事件的类型判断是自己需要处理的事件。这就是我们在ActionListener的onApplicationEvent方法中的如下处理:
if(event instanceof ActionEvent){
PersonBean person = (PersonBean) event.getSource();
System.out.println("Name:" + person.getName());
System.out.println("Password:" + person.getPassword());
}
判断event是不是自己发布的事件,如果是,则进行相应的处理。在onApplicationEvent中可以得到在ActionEvent中传入的对象person, 这个对象可以根据我们的业务处理,传入不同的对象了。
这就是一个简单的事件传播处理机制,我们可以用他来进行对某些事件的监听,比如当某个Bean发生异常, 数据库连接异常等等,我们只要定义自己的Event,和实现一个ApplicationListener的接口,然后根据不同的业务进行相应的处理,使用Spring的事件传播机制就可以很简单的实现了。
在以上内容中最重要的就是要理解,当applicationContext.publishEvent(event)方法调用时,所有的ApplicationListener接口实现都会被激发,在每个ApplicationListener可以根据事件的类型判断是自己需要处理的事件。
以前也一直在用Spring,但是只不过只用到了AOP和DI一些内容。而AOP也仅仅用来做些事务管理和程序开始和结束前的一些处理。打算利用一些时间去了解Spring更多的东西。如果那位朋友有什么好的资料的请告诉一声,共同学习,共同进步。