`
enjiex
  • 浏览: 67643 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring事件机制

阅读更多
Java提供了事件机制,在使用spring的时候,我们可以把普通的java事件操作定义为bean集成到bean容器中,但还有一种更方便的方式,即使用spring已集成的事件支持。
在使用Spring的事件支持时,我们需要关注以下几个对象:
      1. ApplicationEvent:继承自EventObject,同时是spring的application中事件的父类,需要被自定义的事件继承。
      2. ApplicationListener:继承自EventListener,spring的application中的监听器必须实现的接口,需要被自定义的监听器实现其onApplicationEvent方法
      3. ApplicationEventPublisherAware:在spring的context中希望能发布事件的类必须实现的接口,该接口中定义了设置ApplicationEventPublisher的方法,由ApplicationContext调用并设置。在自己实现的ApplicationEventPublisherAware子类中,需要有ApplicationEventPublisher属性的定义。
      4. ApplicationEventPublisher:spring的事件发布者接口,定义了发布事件的接口方法publishEvent。因为ApplicationContext实现了该接口,因此spring的ApplicationContext实例具有发布事件的功能(publishEvent方法在AbstractApplicationContext中有实现)。在使用的时候,只需要把ApplicationEventPublisher的引用定义到ApplicationEventPublisherAware的实现中,spring容器会完成对ApplicationEventPublisher的注入。

在spring的bean配置中,因为事件是由事件源发出的,不需要注册为bean由spring容器管理。所以在spring的配置中,只需配置自定义的ApplicationEventListener和publisherAware(即实现了ApplicationEventPublisherAware接口的发布类),而对于ApplicationEventPublisher的管理和注入都由容器来完成。

基于spring的事件简单实现如下:
1. 定义ApplicationEvent
package com.nuc.event;

import org.springframework.context.ApplicationEvent;
/**
 * 定义Spring容器中的事件,与java普通的事件定义相比,只是继承的父类不同而已,在
 * 在定义上并未有太大的区别,毕竟ApplicationEvent也是继承自EventObject的。
 */
public class MethodExecutionEvent extends ApplicationEvent {

    private static final long serialVersionUID = 2565706247851725694L;
    private String methodName;
    private MethodExecutionStatus methodExecutionStatus;
    
    public MethodExecutionEvent(Object source) {
        super(source);
    }
    
    public MethodExecutionEvent(Object source, String methodName, MethodExecutionStatus methodExecutionStatus) {
        super(source);
        this.methodName = methodName;
        this.methodExecutionStatus = methodExecutionStatus;
    }

    public String getMethodName() {
        return methodName;
    }

    public void setMethodName(String methodName) {
        this.methodName = methodName;
    }

    public MethodExecutionStatus getMethodExecutionStatus() {
        return methodExecutionStatus;
    }

    public void setMethodExecutionStatus(MethodExecutionStatus methodExecutionStatus) {
        this.methodExecutionStatus = methodExecutionStatus;
    }
}

2. 定义ApplicationEventListener
package com.nuc.listener;

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;

import com.nuc.event.MethodExecutionEvent;
import com.nuc.event.MethodExecutionStatus;
/**
 * Spring容器中的事件监听器,与java中基本的事件监听器的定义相比,这里需要实现ApplicationListener接口
 * ApplicationListener接口虽然继承自EventListener,但扩展了EventListener
 * 它在接口声明中定义了onApplicationEvent的接口方法,而不像EventListener只作为标记性接口。
 */

public class MethodExecutionEventListener implements ApplicationListener {

    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof MethodExecutionEvent) {
           if (MethodExecutionStatus.BEGIN
                    .equals(((MethodExecutionEvent) event)
                            .getMethodExecutionStatus())) {
                System.out.println("It's beginning");
            }
            if (MethodExecutionStatus.END.equals(((MethodExecutionEvent) event).getMethodExecutionStatus())) {
                System.out.println("It's ending");
            }
        }
    }
}

3. 定义ApplicationEventPublisherAware
package com.nuc.publisher;

import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;

import com.nuc.event.MethodExecutionEvent;
import com.nuc.event.MethodExecutionStatus;

public class MethodExecutionEventPublisher implements
        ApplicationEventPublisherAware {

    private ApplicationEventPublisher eventPublisher;
    
    public void methodToMonitor() {
        MethodExecutionEvent beginEvent = new MethodExecutionEvent(this, "methodToMonitor", MethodExecutionStatus.BEGIN);
        this.eventPublisher.publishEvent(beginEvent);
        //TODO
        MethodExecutionEvent endEvent = new MethodExecutionEvent(this, "methodToMonitor", MethodExecutionStatus.END);
        this.eventPublisher.publishEvent(endEvent);
    }
    
    public void setApplicationEventPublisher(
            ApplicationEventPublisher applicationEventPublisher) {
        this.eventPublisher = applicationEventPublisher;
    }
}

4. 定义bean配置
<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
	default-autowire="byName">
	<bean id="methodExecListener" class="com.nuc.listener.MethodExecutionEventListener"></bean>
	<bean id="evtPublisher" class="com.nuc.publisher.MethodExecutionEventPublisher"></bean>	
</beans>

5. 使用事件
package com.nuc;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.nuc.publisher.MethodExecutionEventPublisher;

public class App 
{
    public static void main( String[] args )
    {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        MethodExecutionEventPublisher publisher = (MethodExecutionEventPublisher)context.getBean("evtPublisher");
        publisher.methodToMonitor();
    }
}


从实现来上,和使用基本的java事件流程大体一致,不同的是这里不需要自定义发布者,而使用spring实现提供的事件发布实现。当然,这里却引入了ApplicationEventPublisherAware。
分享到:
评论

相关推荐

    使用Spring事件机制实现异步的方法

    使用Spring事件机制实现异步的方法 Spring框架提供了一种事件机制,允许开发者将代码解耦合,实现松散耦合的设计理念。这里将详细介绍如何使用Spring事件机制实现异步的方法。 事件机制的实现主要包括三个部分:...

    spring事件机制

    Spring框架的事件机制是其核心特性之一,它提供了一种基于发布-订阅模式的事件处理方式,使得在Spring应用中的不同组件之间可以进行解耦通信。这个机制允许一个组件(通常是一个服务)触发一个事件,然后其他感兴趣...

    详解Spring事件驱动模型

    一、Spring事件机制的工作流程 1. 定义事件:创建自定义的事件类,继承自`ApplicationEvent`。例如,可以创建一个`CustomEvent`表示特定业务操作完成的事件。 2. 注册监听器:编写`ApplicationListener`接口的实现...

    JAVA-spring学习资源之spring事件

    总结来说,Spring事件机制为组件间的通信提供了一种灵活的方式,减少了组件之间的耦合。理解和掌握这一特性,将有助于你构建更加健壮、易于维护的Spring应用程序。通过实践和探索"JAVA-spring学习资源之spring事件...

    spring笔试题选择和简答题和springboot+cloud选择题和简答题

    Spring Boot+Spring Cloud 试题解析 Spring Boot 是一个基于 Java 的框架,...这些题目涵盖了 Spring Boot 和 Spring Cloud 的基础知识,包括配置文件的读取、日志框架的选择、热部署方式、事件机制、断路器的作用等。

    Spring的事件监听机制示例详解

    Spring的事件监听机制示例详解 事件监听机制是Spring Framework中的一种机制,它允许应用程序在特定的事件发生时执行相应的操作。事件监听机制由事件发布者、事件监听者和事件广播者三个部分组成。在Spring中,事件...

    深入探索Spring事件监听机制:技术与应用

    Spring事件监听机制是Spring框架中的一个重要特性,它基于经典的观察者模式,允许应用程序组件之间进行松耦合的通信。在Spring中,事件监听机制由三部分组成:事件(ApplicationEvent)、事件监听器(Application...

    my_springboot_01.rar

    标题 "my_springboot_01.rar" 涉及的是Spring Boot项目,其中的核心话题是"Spring事件机制(观察者模式)"。这个压缩包包含了一系列与Spring Boot项目开发相关的文件,如构建脚本、配置文件、源代码等。 在Spring...

    EventBus与Spring Event区别详解(EventBus 事件机制,Spring Event事件机制)

    Spring Event的事件机制可以与Spring Framework的其他组件集成,例如Spring MVC、Spring Boot等。这种机制可以使应用程序更加灵活和可扩展。 EventBus与Spring Event的区别 EventBus和Spring Event都是事件机制,...

    event.rar-Spring事件监听机制

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

    spring事件的例子

    在Spring框架中,事件处理是一种重要的组件间通信方式。它允许一个对象在完成特定操作后,通知其他对象这一事实,而无需这些对象之间有直接的依赖关系。这种机制基于Java的观察者模式(Observer Pattern),使得松...

    spring 事件处理

    在Spring框架中,事件处理是一种重要的通信机制,它允许组件之间进行解耦的通信。Spring事件处理基于发布/订阅模式,其中事件是消息的载体,而事件监听器则是对这些消息感兴趣的订阅者。在这个场景中,我们将探讨...

    深入分析Spring源码.docx

    8. **观察者模式**:Spring事件机制中,事件发布者和订阅者之间的交互基于观察者模式,使得组件间的通信更加灵活。 9. **责任链模式**:Spring的过滤器链、拦截器链等都是责任链模式的应用,实现了一次请求由多个...

    spring缓存机制-入门实例

    在Spring框架中,缓存机制是一项重要的功能,它允许我们高效地存储和检索频繁访问的数据,从而提升应用程序的性能。本篇文章将深入探讨Spring缓存机制的基础知识,并通过一个入门实例来阐述其工作原理和使用方法。 ...

    spring运行机制源码剖析

    Spring框架是Java开发中最常用的轻量级框架之一,它的运行机制源码剖析是理解其工作原理的关键。在本文中,我们将深入探讨Spring的核心组件、依赖注入(DI)以及AOP(面向切面编程)的实现。 首先,让我们从Spring...

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

    6. 观察者模式:Spring事件机制中,应用了观察者模式,允许组件之间进行事件通知和响应。 Spring的这些设计模式使得开发者能够更高效地组织代码,提高可维护性和可扩展性。同时,Spring的模块化设计使得我们可以按...

    Spring 设计模式总结1

    7. **观察者模式**:Spring事件机制基于观察者模式,当某个事件发生时,所有注册的监听器都会收到通知。例如,`ApplicationListener`接口可用于监听Spring应用上下文的事件。 8. **策略模式**:Spring允许使用不同...

    SpringCloud常见选择题28道(附答案).docx

    11. Spring的事件机制采用的是订阅和发布模式,即`@EventListener`订阅事件,`ApplicationEventPublisher`发布事件。 12. SpringBoot热部署的一种方式是通过`spring-boot-devtools`,它提供了简化版本控制和自动重启...

    SPRING事务机制DEMO

    Spring事务机制是Java开发中非常重要的一个概念,它在企业级应用中扮演着核心角色,确保数据的一致性和完整性。Spring提供了多种事务管理方式,包括编程式事务管理和声明式事务管理。在这篇DEMO中,我们将重点探讨...

    详解JAVA Spring 中的事件机制

    详解 JAVA Spring 中的事件机制 JAVA Spring 中的事件机制是指在 Spring 框架中实现事件驱动编程的机制。事件机制是指在系统中发生某种事件时,系统会通知注册了该事件的监听器,以便它们可以相应地做出反应。这种...

Global site tag (gtag.js) - Google Analytics