`

spring的事件 处理机制

阅读更多

基于SPRING的事件处理其实很简单,初学者不必一开始就担心搞不懂,本文先是介绍完全基于SPRING的事件监听实现(熟识Spring事件监听的朋友应该跳过第一节),然后依葫芦画瓢自已做一个性能更好事件监听小框架,最后在回贴中加入了注解版。 
    为何要使用事件监听,而不是直接调用?打个比方,在系统删除一个用户时,需要把用户的其他信息和行为记录一起删除,此时最容易想到的是:删除用户时,调用其他Service类接口删除与之相关的信息和用户行为记录,但是用户是一个基础模块,随着系统模块不断增加,会有越来越多的模块与之关联,按以上方案,每增加一个与用户相关的模块,那么删除用户时就要把这个模块的信息也一起删除,这样用户这个模块就与这些业务模块偶合在一起了,只要系统不断的增加或减少模块,用户模块就永远都改不完。(以上逻辑仅为说明问题) 
    如果采用事件监听,那么在删除一个用户时,发布一事件就完事了,所有相关的模块监听此事件,在事件处理中删除本模块对应的数据,那么用户模块也不会与这些模块有任何偶合了。 
    好,回到主题, 
    1、完全基于SPRING的事件监听与处理: 
    首先,SERVICE总接口类继承org.springframework.context.ApplicationListener接口,并且在SERVICE的抽象类中实现此接口的方法,SERVICE总接口代码: 

Java代码 
  1. import org.springframework.context.ApplicationListener;  
  2.   
  3. /** 
  4.  * 业务层顶层接口 
  5.  */  
  6. public interface IBaseService extends ApplicationListener{  
  7.   
  8. }  



SERVICE抽象类代码,所有具体业务类皆继承此抽象业务类

Java代码 
  1. import org.springframework.context.ApplicationEvent;  
  2.   
  3. /** 
  4.  * 实现顶层接口的抽象类 
  5.  */  
  6. public abstract class AbstractBaseService implements IBaseService {  
  7.   
  8.   
  9.     /** 
  10.      * 此方法不允许重写,要监听事件,重写onBaseEvent方法 
  11.      */  
  12.     public final void onApplicationEvent(ApplicationEvent event) {  
  13.         if (event instanceof BaseEvent) {  
  14.             onBaseEvent((BaseEvent) event);  
  15.         }  
  16.     }  
  17.   
  18.     /** 
  19.      * 要监听事件就重写此方法 
  20.      */  
  21.     protected void onBaseEvent(BaseEvent event) {  
  22.     }  
  23.   
  24.          /** 
  25.      * 发布事件 
  26.      */  
  27.     protected final void publishEvent(BaseEvent event) {  
  28.         //取得SPRING容器并发布事件  
  29.         org.springframework.web.context.ContextLoader.getCurrentWebApplicationContext().publishEvent(event);  
  30.     }  
  31. }  


BaseEvent类是我自定义的一个类,各业务模块要发布事件,首先定义自已的EVENT类,继承BaseEvent。BaseEvent类代码

Java代码 
  1. import org.springframework.context.ApplicationEvent;  
  2.   
  3. public class BaseEvent extends ApplicationEvent {  
  4.   
  5.     public BaseEvent(Object source) {  
  6.         super(source);  
  7.     }  
  8.   
  9. }  



用户业务类UserSerivceImpl删除一个用户时,需要发布事件,所以要先定义一个UserDeleteEvent事件类

Java代码 
  1. import com.esc.permission.model.User;  
  2.   
  3. public class UserDeleteEvent extends BaseEvent {  
  4.       
  5.     public UserDeleteEvent(User user){  
  6.         super(user);  
  7.     }  
  8.       
  9.     public User getUser(){  
  10.         return (User) super.getSource();  
  11.     }  
  12.   
  13. }  


下面是UserSerivceImpl类删除用户的方法模拟

Java代码 
  1. public void deleteUser(String id){  
  2.     //先发布删除事件  
  3.     publishEvent(new UserDeleteEvent(new User(id)));  
  4.     //再把用户删除  
  5.     userDao.deleteUser(id);  
  6. }  


假如有一个OtherServiceImpl业务类需要接收用户删除事件并做一些处理,

Java代码 
  1. public class OtherServiceImpl extends AbstractBaseService {  
  2.     private IBaseDAO otherDao;  
  3.   
  4.     /** 
  5.      * 重写父类的方法,处理用户删除事件 
  6.      */  
  7.     protected void onBaseEvent(BaseEvent baseEvent){  
  8.         if(baseEvent instanceof UserDeleteEvent){//如果是用户删除事件  
  9.             otherDao.deleteOtherData(((User)baseEvent.getSource()).getId());  
  10.         }  
  11.     }  
  12. }  


    到此,所有逻辑就完了,用户业务类中根本不需要知道谁将会处理此事件,所以完全与其它模块解偶了。 
    这里用了一个偷懒的方法,那就是在业务类的顶层接口IBaseService中实现了ApplicationListener接口,这样其实所有具体业务类都参与了所有事件的处理,即使是那些根本不需要监听事件的业务类。对于所有根本不需要监听事件的业务类,事件发生时就调用其父类空方法onBaseEvent,这里有一点性能浪费,如果改进?不要在顶层接口IBaseService中实现ApplicationListener接口,而是在具体的需要监听事件的业务类中实现此接口,但是这样还是有一点缺陷,那就是此具体业务类还是会监听到它不关心的事件,不论是用户删除事件还是用户修改事件,没办法,有得必有失,想要方便,肯定会有所牺牲。 

分享到:
评论

相关推荐

    spring 事件处理

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

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

    开发者可以根据需要自定义事件和事件监听器,实现灵活的异步处理机制。 Spring事件机制的优点包括: * 松散耦合的设计理念,提高代码的可维护性和可扩展性。 * 事件机制可以解耦合业务逻辑和非业务逻辑,提高代码...

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

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

    spring事件的例子

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

    详解Spring事件驱动模型

    首先,Spring事件驱动模型是基于观察者模式实现的,即发布者(Publisher)发布事件,订阅者(Subscriber)监听并处理这些事件。在Spring中,事件对象通常是`ApplicationEvent`的子类,发布事件的方法是`...

    spring事件机制

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

    event.rar-Spring事件监听机制

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

    JAVA-spring学习资源之spring事件

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

    SpringBoot+SpringSecurity处理Ajax登录请求问题(推荐)

    为了解决Ajax登录请求问题,我们可以使用Spring Security的 Ajax 登录请求处理机制。首先,我们需要创建一个Spring Boot工程,并引入Web、Spring Security、MySQL和MyBatis依赖项。然后,我们需要配置application....

    Spring事件管理

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

    spring 事件监听 3种方式

    Spring事件监听机制使得我们可以松散地耦合应用程序组件,提高代码的可维护性和扩展性。根据项目需求和场景,可以选择合适的方式实现事件监听。基于接口的监听器适合于早期版本的Spring,基于类的监听器提供了一种更...

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

    EventBus和Spring Event都是基于事件机制的异步处理方式,但它们有着不同的设计理念和实现方式。在本文中,我们将详细剖析EventBus和Spring Event的区别,帮助读者更好地理解和选择合适的事件机制。 EventBus事件...

    J2EE企业级项目开发-1期 08 Spring中事件处理的小技巧.doc

    在Spring框架中,事件处理是一种强大的机制,它允许在应用程序的不同组件之间进行解耦通信。在J2EE企业级项目开发中,理解并熟练运用Spring的事件处理小技巧至关重要。以下将详细介绍Spring事件处理的核心概念、工作...

    Spring的配置以及事件注入

    本篇文章将深入探讨Spring的配置和事件注入机制,帮助开发者更好地理解和利用这些特性。 首先,让我们关注Spring的配置。Spring的配置主要有两种方式:XML配置和Java配置。在早期的Spring版本中,XML配置是最常用的...

    springmvc+spring线程池处理http并发请求数据同步控制问题

    同时,Spring框架提供的线程池功能则可以帮助我们优化多线程环境下的性能,特别是处理并发请求时。在这个主题中,我们将深入探讨如何利用Spring MVC与Spring线程池来有效地管理并发请求,并解决数据同步控制问题。 ...

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

    首先,`ApplicationContext`的事件处理机制是基于Java的`java.util.EventObject`类的。Spring定义了一个名为`ApplicationEvent`的抽象类,它是所有应用事件的基础。当你有一个需要传播的消息或事件时,你可以创建一...

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

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

    Spring 学习2

    总的来说,Spring 事件处理机制是 Spring 框架提供的一种强大的组件间通信手段,允许开发者在不直接依赖的情况下传递信息。通过定义自定义事件、监听器和事件发布,我们可以构建出松散耦合的系统,使得系统更加灵活...

    Spring Cloud Gateway的全局异常处理

    通过本文介绍的自定义异常处理逻辑,可以有效解决Spring Cloud Gateway默认异常处理机制中存在的问题,使得异常信息更加符合业务需求。此外,这种方式也为开发者提供了一个良好的起点,可以根据具体项目需求进一步...

    基于Spring Batch的大数据量并行处理

    ### 基于Spring Batch的大数据量并行处理 #### 概述 Spring Batch是一款用于高效处理大量数据的开源框架,特别适用于批处理任务。它由Spring Source与Accenture合作开发,结合了双方在批处理架构和技术上的优势,...

Global site tag (gtag.js) - Google Analytics