`

spring 自定义事件处理机制

阅读更多

 自定义的事件监听与处理框架。 

如果只想监听到自已所关心的事件呢,那么就要自已实现一套事件处理的小框架了:
    首先重新定义事件监听器接口,不再使用SPRING提供的ApplicationListener接口:

Java代码 
  1. import java.util.List;  
  2.   
  3. /** 
  4.  * 事件处理接口,实现此接口并且getEventClasses方法的返回结果条数大于0,方可处理对应的事件 
  5.  */  
  6. public interface IBaseEventListener {  
  7.     /** 
  8.      * 事件处理的方法 
  9.      */  
  10.     public void onBaseEvent(BaseEvent event);  
  11.       
  12.     /** 
  13.      * 所要处理的事件类型 
  14.      */  
  15.     public List<Class<? extends BaseEvent>> getEventClasses();  
  16. }  


    这个接口比SPRING的事件接口多了一个方法。因为SPRING原来做法是只要实现了它提供的接口,任何事件发生时都会得到调用,这种做法是很方便使用的,这里沿用了这种思路。多出的那个方法作用是描述本类处理哪些事件。这时我需要一个类,这个类要在系统启动时把所有实现此接口的业务类找出来,归好类,以便事件发生时进行精确调用,并且提供事件发布事件的静态方法,这样我们才能知道事件在何时发生了。好,下面就来编写这个类

Java代码 
  1. /** 
  2.  * 事件处理相关操作工具类 
  3.  */  
  4. public class EventController {  
  5.     /** KEY:事件类的类名,值:所有监听此事件的处理类实例  */  
  6.     private static Map<String,List<IBaseEventListener>> listeners = new LinkedHashMap<String, List<IBaseEventListener>>();  
  7.       
  8.     private EventController(){  
  9.         //no instance  
  10.     }  
  11.       
  12.     /** 
  13.      * 扫瞄所有bean,进行事件监听(业务类按事件类型归类),此方法要在系统启动完后立即调用 
  14.      * 此方法大概过程是 
  15.      * 1、从SPRING中找出所实现了IBaseEventListener的具体业务类实例 
  16.      * 2、把这些实例归类装进MAP变量listeners中,此MAP变量的结构是: 
  17.      * "UserDeleteEvent.class",{ortherServiceImpl,xxxServiceImpl,...} 
  18.      * "UserUpdateEvent.class",{yyyServiceImpl,zzzServiceImpl,...} 
  19.      * key,valueList 
  20.      */  
  21.     public static void initBaseEventListener(){  
  22.         //从SPRING中得到实现了某接口的业务类  
  23.         Map<String,IBaseEventListener> beans = ContextLoader.getCurrentWebApplicationContext().getBeansOfType(IBaseEventListener.class);  
  24.         if(beans==null || beans.size()==0)  
  25.             return;  
  26.         //下面循环进行归类  
  27.         Collection<IBaseEventListener> services = beans.values();  
  28.         for (IBaseEventListener service : services) {  
  29.             List<Class<? extends BaseEvent>> eventClasses = service.getEventClasses();  
  30.             if(eventClasses==null || eventClasses.size()==0)  
  31.                 continue;  
  32.               
  33.             for (int i = 0; i < eventClasses.size(); i++) {  
  34.                 List<IBaseEventListener> list = listeners.get(eventClasses.get(i).getName());  
  35.                 if(list==null){  
  36.                     list = new ArrayList<IBaseEventListener>();  
  37.                     listeners.put(eventClasses.get(i).getName(), list);  
  38.                     list.add(service);  
  39.                 }else{  
  40.                     if(list.contains(service)){  
  41.                         continue;  
  42.                     }else{  
  43.                         list.add(service);  
  44.                     }  
  45.                 }  
  46.             }  
  47.         }  
  48.     }  
  49.       
  50.     /** 
  51.      * 发布事件的静态方法 
  52.      */  
  53.     public static void publishEvent(BaseEvent event){  
  54.         //根据实际事件名称,从listeners中找出监听了此事件的业务类,调用之  
  55.         List<IBaseEventListener> list = listeners.get(event.getClass().getName());  
  56.         if(list!=null && list.size()>0){  
  57.             for (IBaseEventListener listener : list) {  
  58.                 //此处不能捕捉异常,因为任何一个处理类实例出错都应该全部回滚  
  59.                 listener.onBaseEvent(event);  
  60.             }  
  61.         }  
  62.     }  
  63. }  


    接着重新定义事件类本身,此类也不再继承SPRING的ApplicationEvent类,其它基本还和原来一样。

Java代码 
  1. public class BaseEvent {  
  2.     private Object source;  
  3.     public BaseEvent() {  
  4.     }  
  5.       
  6.     public BaseEvent(Object source) {  
  7.         this.source = source;  
  8.     }  
  9.   
  10.     public Object getSource() {  
  11.         return source;  
  12.     }  
  13. }  



业务类顶层接改而继承自已的事件接口 

Java代码 
  1. /**   
  2.  * 业务层顶层接口   
  3.  */    
  4. public interface IBaseService extends IBaseEventListener{     
  5.     
  6. }   



    分享到:
    评论

    相关推荐

      spring自定义注解样例

      总结来说,Spring自定义注解和AOP的结合使用,让我们能够灵活地在代码中插入跨切面的关注点,如日志记录、事务管理、性能监控等,而不必在每个方法中手动添加这些代码。这不仅提高了代码的整洁度,也使得系统更加...

      spring 自定义属性编辑器

      首先,了解Spring中的属性编辑器机制。Spring会自动寻找并使用`java.beans.PropertyEditor`接口的实现来处理类型转换。这个接口定义了两个主要方法:`setAsText()`用于将字符串转换为对象,`getAsText()`则用于将...

      Spring 自定义注解的解析

      总的来说,Spring自定义注解的解析是一个强大且灵活的工具,可以帮助我们实现更精细化的代码组织和控制。结合`@ComponentScan`,我们可以轻松地在Spring环境中管理和利用自定义注解,进一步提升代码的可读性和可维护...

      spring 事件处理

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

      spring mvc 和spring security自定义登录

      此外,Spring Security还提供了丰富的授权机制,如角色和权限控制。我们可以通过在URL前添加@Secured或@PreAuthorize注解,或者在配置类中定义访问规则,来限制对特定资源的访问。这使得我们可以根据用户的角色和...

      Spring自定义配置文件便签[Maven]工程可运行

      这个名为"Spring自定义配置文件便签[Maven]工程可运行"的项目,显然是一个基于Maven构建的Spring 5.0应用程序,它包含了自定义配置文件和标签的实现。让我们深入探讨一下这些概念及其在实际应用中的作用。 首先,...

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

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

      Spring Cloud Gateway的全局异常处理

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

      Spring 5.2.9 06 源码分析-spring自定义标签解析过程

      本文将深入剖析Spring 5.2.9版本中自定义标签的解析过程,旨在帮助读者理解Spring内部的工作机制。 首先,我们了解自定义标签的基本概念。在Spring中,自定义标签通常是通过实现`org.springframework.beans.factory...

      spring自定义注解+Aspect使用1

      Spring 自定义注解和 Aspect 的使用 在本文中,我们将学习如何在 Spring 项目中使用自定义注解和 Aspect 来实现日志记录功能。...* Spring 中的 AOP 机制 * 使用自定义注解和 Aspect 来实现日志记录功能

      这一次搞懂Spring自定义标签以及注解解析原理说明

      总结起来,Spring的自定义标签解析是通过`NamespaceHandler`机制实现的,而注解解析则依赖于类路径扫描和`BeanDefinition`的创建。这两者都是Spring实现声明式编程和依赖注入的重要组成部分,极大地简化了Spring应用...

      spring事件的例子

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

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

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

      借助spring自定义命令执行器

      在Spring中,我们可以创建一个自定义的BeanPostProcessor实现,它会在Spring容器初始化bean之后、bean被其他bean使用之前,对bean进行额外的处理,比如执行特定的方法。 3. **BeanPostProcessor**:Spring的...

      spring事件机制

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

      06 源码分析-spring自定义标签解析过程

      本节将深入探讨Spring 5.2.9版本中自定义标签的解析机制,以及背后的源码实现。 首先,Spring XML配置文件中的自定义标签是由Spring的`BeanDefinitionParser`接口处理的。这个接口定义了`parse()`方法,用于解析...

      spring security 4 小例子带自定义过滤器

      这个过滤器可以在认证阶段处理特定的场景,如自定义的认证机制、特殊的身份验证令牌处理等。在实际应用中,可能还需要根据项目需求进行更复杂的定制,比如集成OAuth2、JWT或其他安全协议。 在提供的压缩包文件...

      这一次搞懂Spring自定义标签以及注解解析原理说明.docx

      总的来说,Spring自定义标签和注解解析原理的学习,不仅能够帮助开发者深入理解Spring的工作机制,还能提供自定义配置和扩展Spring功能的能力。通过这种方式,开发者可以根据项目需求创建出更符合业务逻辑的配置方式...

      精讲RestTemplate自定义请求失败异常处理.docx

      在使用Spring框架中的`RestTemplate`进行HTTP请求时,我们可能会遇到各种异常情况,如服务超时、服务不存在等,这些异常...在实际项目中,这种自定义处理机制非常实用,能够帮助我们更好地管理和服务调用的错误情况。

      自定义MVC框架(spring)

      在自定义MVC框架时,首先要实现请求分发机制。DispatcherServlet在Spring MVC中扮演着关键角色,它接收所有HTTP请求,解析请求信息,然后根据请求映射信息找到对应的Handler(控制器)。我们可以仿照这个设计,创建...

    Global site tag (gtag.js) - Google Analytics