随笔 - 11, 文章 - 1, 评论 - 20, 引用 - 0
数据加载中……

基于拦截器的企业应用构造

    在上一篇文章里,我们使用了基于事件传递的机制来对企业应用的子系统进行解耦,但是由于需要强制地继承或者实现一个广播事件的接口EventBrocast,实际上,就职责分离和功能单一的角度来看,前篇文章中的例子中,这个机制对OrderService侵入太大了,我们必须寻找更为有效的方法,不需要程序实现某个接口或继承某个超类来完成这个工作,这一切必须对具体程序完全透明,这个责任谁能承担呢,毫无疑问,历史的重担就落在了AOP身上 ;) 。下面我们来看看具体的实现:
    OrderService已经实现,除了订单的处理,没有任何的职责,为了完成事件的广播,必须要有一个途径能够拦截到OrderService的所有方法调用,然后分析调用的语义(参数),并根据这些内容给广播出去。而恰好,AOP组织统一的接口MethodInterceptor可以完成这个功能。于是上篇文章的程序可以这样修改:

   // 订单服务只负责做好自己的事
  

 public class OrderService {
     
public Order saveOrder(Order order){
     。。。。处理订单
     。。。保存
     }
  }

 

  而为了拦截任何的方法调用,则实现了拦截器EventBrocaster:
 

public class EventBrocaster extends LifeEventBrocast implements MethodInterceptor  {
    
private List eventListeners;
    
public void setEventListener(List list){
     
this.eventListeners=list;
    }
    
public List geteEventListeners(){
     
return eventListeners;
    }
    
public Object invoke(MethodInvocation invoke) {
      obj 
= invoke.proceed();// 执行被拦截的方法完成业务操作
      Object[] params = invoke.getArguments();
     Object param 
= params.length > 1 ? params : params[0];
     Event le 
= new Event(param, eventType);
     brocast(le);
// 广播
    }
  }

 

  事件侦听器:
 

 public OrderEventListener implements EventListener{
  
private FinancialService  financialService;
   
public void setFinancialService(FinancialService fs){
     
this.financialService=fs;
   }
  
public void performed(Event e){
   Order order 
=(Order) e.getObject();
    financialService.createRequestOfMoney(order.getAmount());
  }
 }

 


  然后,在Spring配置里将这些组件全部连接起来:

 1.OrderService实现:
 <bean id="orderServiceImpl" class="OrderService" autowire="byName">
 </bean>

 2. 声明OrderService代理:

 <bean id="orderService" class="org.springframework.aop.framework.ProxyFactoryBean">
  <property name="target">
   <ref local="orderServiceImpl"/>
  </property>
  <property name="interceptorNames"> <!--拦截器列表-->
   <list>
    <value>eventBrocaster</value>
   </list>
  </property>
  <property name="singleton">
   <value>true</value>
  </property>
 </bean>
  3.事件广播拦截器
 <bean id="eventBrocaster" class="com.wolfsquare.core.service.EventBrocaster" singleton="true">
  <property name="lifecycleListeners">
      <list>
       <ref bean="orderEventListener"/>
      </list>
     </property>
 </bean>
  4.具体的财务子系统的侦听器实现与财务系统的通讯:
  <bean id="orderEventListener" class="OrderEventListener" autowire="byName">
   <propety name="financialService"><ref bean="financialService"/></property>
 </bean>

    这样,我们与具体实现无关的事件广播就做到了,聪明的朋友看到这里,肯定想到了拦截器方式不仅仅适用与事件广播,还可以实现事务的统一管理,事实上Spring的事务管理就是这样完成的,还可以实现权限的控制例如Acegi,简直有点象万能的胶水,呵呵。

    从两篇文章的逐步探讨下,同一个机器,同一个虚拟机之内的数据通讯都可以实现了,那么异构系统和多虚拟机间的通讯又如何处理呢,于是ESB(企业服务总线)的概念就慢慢浮现出来了,不过这个不在本文探讨的范畴了,也许在不久的将来,我会补上这一篇。

(全文完)

 

 

posted on 2005-12-06 20:49 wolfsquare 阅读(2786) 评论(6)  编辑  收藏 所属分类: 企业应用

评论

# re: 基于拦截器的企业应用构造  回复  更多评论   

这样的好文章还要让我等多久呢?
期待高手再度亮剑!
2005-12-26 12:38 | 胡子鱼

# re: 基于拦截器的企业应用构造  回复  更多评论   

在流程方面看看这遍文章再审视自己的代码`````只觉得自己恶心了!
2006-01-19 23:51 | JavaXP

# re: 基于拦截器的企业应用构造  回复  更多评论   

因为自己也在思考AOP、事件驱动、组件容器之间的关系。在我的想法中,AOP、特别是动态AOP的拦截点和事件的触发点是很相似的,比如也可以定义 before事件和after事件(只是around定义起来比较别扭)。实际上,我也找到了以事件驱动的观点来认识AOP的学术文章("Towards Event-Based Aspect-Oriented Runtime Environments")。从事件驱动的观点出发,我思考了事件的路由、状态/上下文、存储/转发、同步/异步等机制,也逐渐发现按这个思路发展下去很自然地就拓展到了工作流、BPEL和ESB这些领域。我试图把在现有IoC组件容器解决了组件静态依赖关系如何装配的基础上,将AOP/事件驱动来作为组件之间的交互机制,把事件路由作为业务逻辑控制的核心,然后,就可以很容易地整合工作流这类概念。所以,我看到这篇文章非常惊喜,能和你用 mail/msn等方式直接联系吗?

忘了,我的MSN和email都是suntoech@sh163.net
2006-01-23 09:48 | qiangyt

# re: 基于拦截器的企业应用构造  回复  更多评论   

文章不错! 向你学习
2006-04-26 14:07 | pc

# re: 基于拦截器的企业应用构造  回复  更多评论   

挺有深度,我喜欢
2007-03-08 16:46 | cljspn

# re: 基于拦截器的企业应用构造  回复  更多评论   

时至今日才想到这个问题,差距好大啊
2008-04-07 10:05 | lexus

只有注册用户登录后才能发表评论。


网站导航: