`

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可以根据事件的类型判断是自己需要处理的事件。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chensugang/archive/2008/11/09/3261009.aspx

分享到:
评论

相关推荐

    spring事件传播

    spring发布和接收定制事件(这个上传必须要填资源分啦),ApplicationContext基于Observer模式(java.util包中有对应实现),提供了针对Bean的事件传 播功能。通过Application. publishEvent方法,我们可以将事件...

    spring 事务传播 demo

    本示例“spring 事务传播 demo”将聚焦于Spring的事务传播行为,这是在多个方法调用中控制事务边界的关键概念。下面我们将详细讨论相关知识点。 首先,事务传播行为是指当一个被@Transactional注解的方法被另一个@...

    Spring中事务的传播属性详解

    ### Spring中事务的传播属性详解 #### 一、引言 在使用Spring框架进行应用程序开发时,事务管理是一项非常重要的特性。Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。其中,声明式事务管理因其...

    Spring事务传播机制.docx

    Spring 事务传播机制 Spring 事务传播机制是指在 Spring 框架中,事务的传播和嵌套机制。当我们在使用 Spring 所提供的事务功能时,如果是仅仅处理单个的事务,是比较容易把握事务的提交与回滚,不过一旦引入嵌套...

    spring事件的例子

    Spring事件处理还支持事件分发策略,如多线程处理事件,可以通过配置`SimpleApplicationEventMulticaster`或自定义实现`ApplicationEventMulticaster`接口来调整事件的传播方式。 此外,Spring还提供了`...

    Spring事务传播特性解析

    通过代码解析spring传播特性,包括 1、Propagation.REQUIRED 方法被调用时自动开启事务,在事务范围内使用则使用同一个事务,否则开启新事务。 2、Propagation.REQUIRES_NEW 无论何时自身都会开启事务 3、...

    spring 事务传播

    ### Spring 事务传播属性详解 #### 一、Spring 事务基础概述 在深入探讨Spring框架中的事务传播属性之前,我们先来简要回顾一下Spring事务的基础概念。Spring框架提供了强大的事务管理功能,允许开发者通过声明式...

    spring事物传播测试表

    事务传播行为(Transaction Propagation)是Spring事务管理中一个关键的概念,用于定义在一个事务方法被调用时,如何与当前运行的事务进行交互。本文将深入探讨“Spring事物传播测试表”所涉及的知识点。 首先,...

    Spring框架的设计理念与设计模式分析之一

    5. **观察者模式**:Spring事件传播机制使用了观察者模式,使得组件之间能够相互通信而不必彼此了解对方的内部结构。 #### 六、对软件设计的启示 Spring框架的设计理念及其所采用的设计模式为软件开发人员提供了...

    Spring事件管理

    在Spring框架中,事件管理是一种强大的机制,它允许在应用程序组件之间传递消息,而无需这些组件之间有直接的依赖关系。这种松耦合的方式提高了代码的可维护性和可测试性。接下来,我们将深入探讨Spring事件管理的...

    JAVA-spring学习资源之spring事件

    此外,Spring还支持`ApplicationEventMulticaster`接口,你可以自定义事件多播器来控制事件的传播策略,比如异步处理事件。 通过`demo_adv_event_01_event_base`这个压缩包中的示例,你可以更深入地了解如何在实际...

    Spring事务传播Demo.zip

    本篇将基于"Spring事务传播Demo"来深入探讨Spring事务管理和传播行为。 首先,我们需要理解什么是事务。在数据库操作中,事务是一组操作,这些操作要么全部执行,要么全部不执行,以确保数据的一致性和完整性。在...

    Spring的配置以及事件注入

    当你有一个事件需要在整个应用中传播时,可以创建一个自定义的事件类,继承自ApplicationEvent。例如: ```java public class CustomEvent extends ApplicationEvent { private String eventData; public ...

    spring事务的传播特性和事务隔离级别

    ### Spring事务的传播特性和事务隔离级别 #### 一、Spring事务的传播特性(Propagation) 在Spring框架中,事务管理不仅提供了ACID属性的支持,还引入了事务的传播特性,这些特性决定了当一个方法调用另一个方法时,...

    spring 事务传播与隔离级别DEMO

    本DEMO主要探讨的是Spring事务的传播行为和隔离级别,这些概念对于理解和优化数据库操作至关重要。让我们深入理解这些概念及其实际应用。 首先,我们来谈谈事务的传播行为。在Spring中,当一个方法被另一个具有事务...

    spring的Applicationcontext对事件的监听,实现类似MQ的效果

    当你有一个需要传播的消息或事件时,你可以创建一个继承自`ApplicationEvent`的自定义事件类。 创建自定义事件类的示例如下: ```java public class MyCustomEvent extends ApplicationEvent { private String ...

    event.rar-Spring事件监听机制

    在Spring框架中,事件监听机制是一种非常重要的组件间通信方式,它允许应用程序的不同部分通过发布和订阅事件来进行异步通信。这种模式使得组件之间松耦合,提高了代码的可维护性和可扩展性。下面我们将详细探讨...

    Spring事务传播属性

    Spring事务传播属性是这一机制的关键组成部分,它定义了在一个事务方法被另一个事务方法调用时,应该如何处理事务的边界。在深入理解Spring事务传播属性之前,我们首先需要了解Spring中的事务管理模型,包括编程式...

    Spring在Transaction事务传播行为种类

    ### Spring中的Transaction事务传播行为种类详解 #### 一、引言 在开发基于Spring框架的应用程序时,事务管理是确保数据一致性的重要手段之一。Spring框架提供了丰富的事务管理功能,其中包括了事务传播行为...

    SPRING事务传播特性&事务隔离级别

    ### Spring 事务传播特性和事务隔离级别详解 #### 一、Spring 事务传播特性 在进行多层服务架构设计时,事务的管理尤其重要。为了确保数据的一致性,Spring 提供了一种灵活的方式来控制事务的传播行为。下面详细...

Global site tag (gtag.js) - Google Analytics