Spring的事件传播

最近看了一下<Spring 开发指南>这本书,在里面看到Spring事件传播的相关内容,觉得比较有用,根据书上再价格自己的理解,完成了一个简单的例子,今天与大家一起来分享一下。

 

以实例来说话我想大家都容易理解,下面来看例子,有以下几个类:

 

事件类:ActionEvent.java

事件监听类:ActionListener.java

逻辑处理类:ActionLogic.java

还有一个BeanPersonBean.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接口,这里最关键就是applicationContextpublishEvent方法,它起到发布事件,通知Listener的目的。

 

接下来就是简单的PersonBean了,里面只有2个属性,namepassword,这里代码就不贴出来了。

 

测试类: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中定义ActionListenerActionLogic就可以了。如下所示:

<bean id="actionLogic" class="com.spring.test.ActionLogic"/>

<bean id="listener" class="com.spring.test.ActionListener"/>

 

运行TestMain就可以看到控制台打出以下结果:

Name:fengyun

Password:123456

 

我们可以看到,我们运行logic.execute()方法时,自动调用了ActionListeneronApplicationEvent方法。也许我们现在还觉得很奇怪,我们并没有调用ActionListener类啊,这是因为在ApplicationContext会自动在当前所有的Bean中寻找ApplicationListener接口的实现,并将其作为事件接收的对象。当

applicationContext.publishEvent(event)方法调用时,所有的ApplicationListener接口实现都会被激发,在每个ApplicationListener可以根据事件的类型判断是自己需要处理的事件。这就是我们在ActionListeneronApplicationEvent方法中的如下处理:

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,但是只不过只用到了AOPDI一些内容。而AOP也仅仅用来做些事务管理和程序开始和结束前的一些处理。打算利用一些时间去了解Spring更多的东西。如果那位朋友有什么好的资料的请告诉一声,共同学习,共同进步。

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值