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. }   



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值