转自
http://blog.csdn.net/u011704894/article/details/44407145
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 .