`

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也支持自定义事件,提供灵活性来处理特定业务需求。 事件监听器是对事件响应的处理器。它们可以通过实现ApplicationListener接口或使用@EventListener注解来定义。这些监听器关注特定类型的事件,...

      自定义微服务熔断处理机制

      资源用springcloud搭的一个小框架,涉及Hystrix自定义熔断机制知识点,适合初学者理解微服务,大神绕过!

      springboot工程自定义response注解、自定义规范化返回数据结构

      springboot工程通过自定义response注解、java反射机制、自定义java拦截器、自定义功能类实现WebMvcConfigurer接口等功能,实现自定义规范化返回数据结构。

      Java Spring框架面试题大全

      开发者可以自定义事件类和事件监听器,并通过应用程序上下文的publishEvent方法来发布事件,Spring框架会自动分发事件给所有对该事件感兴趣的监听器进行处理。事件监听机制帮助开发者更好地解耦代码,提高应用程序的...

      Java异常介绍及Spring Boot统一异常处理

      Spring Boot 提供了统一的异常处理机制,通过使用 @ControllerAdvice 和 @ExceptionHandler 注解,可以实现对控制器层、Service 层、Dao 层以及 Spring 系统内定义的部分异常的统一处理。 在 Spring Boot 中,可以...

      从零开始学Spring Boot

      1.16 处理静态资源(自定义资源映射) 1.17 Spring Boot定时任务的使用 1.18 Spring Boot使用Druid和监控配置 1.19 Spring Boot使用Druid(编程注入) 1.20 Spring Boot普通类调用bean 1.21 使用模板(thymeleaf-...

      Spring Security OAuth2.0学习笔记.zip

      别处理什么,如何自定义这些组件满足个性需求。 OAuth2.0认证的四种模式?它们的大体流程是什么? Spring cloud Security OAuth2包括哪些组件?职责? 分布式系统认证需要解决的问题? 掌握学习方法,掌握思考方式。

      Spring-Reference_zh_CN(Spring中文参考手册)

      3.8.2. 事件 3.8.3. 底层资源的访问 3.8.4. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.9.1. 使用Singleton-helper类 4. 资源 4.1. 简介 4.2. Resource 接口 4.3. 内置 Resource 实现...

      Spring 2.0 开发参考手册

      3.8.2. 事件 3.8.3. 底层资源的访问 3.8.4. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.9.1. 使用Singleton-helper类 4. 资源 4.1. 简介 4.2. Resource 接口 4.3. 内置 ...

      Spring.3.x企业应用开发实战(完整版).part2

      5.6.2 解构Spring事件体系的具体实现 5.6.3 一个实例 5.7 小结 第6章 Spring AOP基础 6.1 AOP概述 6.1.1 AOP到底是什么 6.1.2 AOP术语 6.1.3 AOP的实现者 6.2 基础知识 6.2.1 带有横切逻辑的实例 6.2.2 JDK动态代理 ...

      Spring中文帮助文档

      3.8.3. 事件 3.8.4. 底层资源的访问 3.8.5. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.10. 以J2EE RAR文件的形式部署Spring ApplicationContext 3.11. 基于注解(Annotation-...

      springCloud.rar(私聊博主要密码)

      + mybatis-plus + 令牌token + 全局异常管理 + 统一返回数据拦截 + 自定义异常 + 处理ajax跨域请求 + Feign + 熔断机制 + eureka + 单元测试(controller、service、mapper层) + redis集群集成练习 + redis操作练习 ...

      基于spring boot+spring security+jwt实现的基础auth机制

      基于spring boot+spring security+jwt实现的基础auth机制。在SpringBootApplication上添加@EnableWebSecurityJwt。同时需要自己实现一个UserDetailsService。

      spring chm文档

      Spring Framework 开发参考手册 Rod Johnson Juergen Hoeller Alef Arendsen Colin Sampaleanu Rob Harrop Thomas Risberg Darren Davison Dmitriy Kopylenko Mark Pollack Thierry Templier Erwin ...

      Spring API

      3.8.3. 事件 3.8.4. 底层资源的访问 3.8.5. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.10. 以J2EE RAR文件的形式部署Spring ApplicationContext 3.11. 基于注解(Annotation-...

      Spring Data JPA 原理与实战2021年

      │ 14 乐观锁机制和重试机制在实战中应该怎么用.mp │ 18 生产环境多数据源的处理方法有哪些?.mp4 │ 19 如何搞清楚事务、连接池的关系?正确配置是怎样的?.mp4 │ 20 Spring JPA 中的 Hibernate 加载过程与...

      spring security 参考手册中文版

      远程处理 - spring-security-remoting.jar 25 Web - spring-security-web.jar 25 配置 - spring-security-config.jar 26 LDAP - spring-security-ldap.jar 26 ACL - spring-security-acl.jar 26 CAS - spring-...

      errors-spring-boot-starter:Spring Boot的优雅错误处理

      建立在Spring Boot出色的异常处理机制之上, errors-spring-boot-starter提供了: 处理所有异常的一致方法。 不管是验证/绑定错误,还是自定义特定域的错误,甚至是与Spring相关的错误,都将由WebErrorHandler实现...

      springCloud

      Spring Cloud简介 Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud ...

      Spring3.x企业应用开发实战(完整版) part1

      5.6.2 解构Spring事件体系的具体实现 5.6.3 一个实例 5.7 小结 第6章 Spring AOP基础 6.1 AOP概述 6.1.1 AOP到底是什么 6.1.2 AOP术语 6.1.3 AOP的实现者 6.2 基础知识 6.2.1 带有横切逻辑的实例 6.2.2 JDK动态代理 ...

    Global site tag (gtag.js) - Google Analytics