Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > Java > 基于拦截器的企业应用构造
【标  题】:基于拦截器的企业应用构造
【关键字】:
【来  源】:http://www.blogjava.net/wolfsquare/archive/2005/12/06/22772.html

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

Your Ad Here

    在上一篇文章里,我们使用了基于事件传递的机制来对企业应用的子系统进行解耦,但是由于需要强制地继承或者实现一个广播事件的接口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(企业服务总线)的概念就慢慢浮现出来了,不过这个不在本文探讨的范畴了,也许在不久的将来,我会补上这一篇。

(全文完)

 

 

朋友写的关于框架的文章:【上一篇】
基于Java的高性能TP Monitor的设想:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • 视频压缩编解码标准综述
  • C++ Builder初学问与答11
  • VB程序访问Webbroser控件中的滚动文本筐/多行文本域(textarea)的方法
  • 中秋与Linux节
  • 跟我学之用FormLayout打造自适应窗体大小的控件布局
  • 让FreeBSD更安全!
  • 用xsl添加xml-stylesheet
  • Hibernate 级联删除
  • 《设计模式》之Java解读--适配器Adapter
  • RGBtoChange
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.