<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 11, 文章 - 1, 評(píng)論 - 20, 引用 - 0
    數(shù)據(jù)加載中……

    基于攔截器的企業(yè)應(yīng)用構(gòu)造

        在上一篇文章里,我們使用了基于事件傳遞的機(jī)制來對(duì)企業(yè)應(yīng)用的子系統(tǒng)進(jìn)行解耦,但是由于需要強(qiáng)制地繼承或者實(shí)現(xiàn)一個(gè)廣播事件的接口EventBrocast,實(shí)際上,就職責(zé)分離和功能單一的角度來看,前篇文章中的例子中,這個(gè)機(jī)制對(duì)OrderService侵入太大了,我們必須尋找更為有效的方法,不需要程序?qū)崿F(xiàn)某個(gè)接口或繼承某個(gè)超類來完成這個(gè)工作,這一切必須對(duì)具體程序完全透明,這個(gè)責(zé)任誰(shuí)能承擔(dān)呢,毫無疑問,歷史的重?fù)?dān)就落在了AOP身上 ;) 。下面我們來看看具體的實(shí)現(xiàn):
        OrderService已經(jīng)實(shí)現(xiàn),除了訂單的處理,沒有任何的職責(zé),為了完成事件的廣播,必須要有一個(gè)途徑能夠攔截到OrderService的所有方法調(diào)用,然后分析調(diào)用的語(yǔ)義(參數(shù)),并根據(jù)這些內(nèi)容給廣播出去。而恰好,AOP組織統(tǒng)一的接口MethodInterceptor可以完成這個(gè)功能。于是上篇文章的程序可以這樣修改:

       // 訂單服務(wù)只負(fù)責(zé)做好自己的事
      

     public class OrderService {
         
    public Order saveOrder(Order order){
         。。。。處理訂單
         。。。保存
         }
      }

     

      而為了攔截任何的方法調(diào)用,則實(shí)現(xiàn)了攔截器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();// 執(zhí)行被攔截的方法完成業(yè)務(wù)操作
          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實(shí)現(xiàn):
     <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.具體的財(cái)務(wù)子系統(tǒng)的偵聽器實(shí)現(xiàn)與財(cái)務(wù)系統(tǒng)的通訊:
      <bean id="orderEventListener" class="OrderEventListener" autowire="byName">
       <propety name="financialService"><ref bean="financialService"/></property>
     </bean>

        這樣,我們與具體實(shí)現(xiàn)無關(guān)的事件廣播就做到了,聰明的朋友看到這里,肯定想到了攔截器方式不僅僅適用與事件廣播,還可以實(shí)現(xiàn)事務(wù)的統(tǒng)一管理,事實(shí)上Spring的事務(wù)管理就是這樣完成的,還可以實(shí)現(xiàn)權(quán)限的控制例如Acegi,簡(jiǎn)直有點(diǎn)象萬能的膠水,呵呵。

        從兩篇文章的逐步探討下,同一個(gè)機(jī)器,同一個(gè)虛擬機(jī)之內(nèi)的數(shù)據(jù)通訊都可以實(shí)現(xiàn)了,那么異構(gòu)系統(tǒng)和多虛擬機(jī)間的通訊又如何處理呢,于是ESB(企業(yè)服務(wù)總線)的概念就慢慢浮現(xiàn)出來了,不過這個(gè)不在本文探討的范疇了,也許在不久的將來,我會(huì)補(bǔ)上這一篇。

    (全文完)

     

     

    posted on 2005-12-06 20:49 wolfsquare 閱讀(2820) 評(píng)論(6)  編輯  收藏 所屬分類: 企業(yè)應(yīng)用

    評(píng)論

    # re: 基于攔截器的企業(yè)應(yīng)用構(gòu)造  回復(fù)  更多評(píng)論   

    這樣的好文章還要讓我等多久呢?
    期待高手再度亮劍!
    2005-12-26 12:38 | 胡子魚

    # re: 基于攔截器的企業(yè)應(yīng)用構(gòu)造  回復(fù)  更多評(píng)論   

    在流程方面看看這遍文章再審視自己的代碼`````只覺得自己惡心了!
    2006-01-19 23:51 | JavaXP

    # re: 基于攔截器的企業(yè)應(yīng)用構(gòu)造  回復(fù)  更多評(píng)論   

    因?yàn)樽约阂苍谒伎糀OP、事件驅(qū)動(dòng)、組件容器之間的關(guān)系。在我的想法中,AOP、特別是動(dòng)態(tài)AOP的攔截點(diǎn)和事件的觸發(fā)點(diǎn)是很相似的,比如也可以定義 before事件和after事件(只是around定義起來比較別扭)。實(shí)際上,我也找到了以事件驅(qū)動(dòng)的觀點(diǎn)來認(rèn)識(shí)AOP的學(xué)術(shù)文章("Towards Event-Based Aspect-Oriented Runtime Environments")。從事件驅(qū)動(dòng)的觀點(diǎn)出發(fā),我思考了事件的路由、狀態(tài)/上下文、存儲(chǔ)/轉(zhuǎn)發(fā)、同步/異步等機(jī)制,也逐漸發(fā)現(xiàn)按這個(gè)思路發(fā)展下去很自然地就拓展到了工作流、BPEL和ESB這些領(lǐng)域。我試圖把在現(xiàn)有IoC組件容器解決了組件靜態(tài)依賴關(guān)系如何裝配的基礎(chǔ)上,將AOP/事件驅(qū)動(dòng)來作為組件之間的交互機(jī)制,把事件路由作為業(yè)務(wù)邏輯控制的核心,然后,就可以很容易地整合工作流這類概念。所以,我看到這篇文章非常驚喜,能和你用 mail/msn等方式直接聯(lián)系嗎?

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

    # re: 基于攔截器的企業(yè)應(yīng)用構(gòu)造  回復(fù)  更多評(píng)論   

    文章不錯(cuò)! 向你學(xué)習(xí)
    2006-04-26 14:07 | pc

    # re: 基于攔截器的企業(yè)應(yīng)用構(gòu)造  回復(fù)  更多評(píng)論   

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

    # re: 基于攔截器的企業(yè)應(yīng)用構(gòu)造  回復(fù)  更多評(píng)論   

    時(shí)至今日才想到這個(gè)問題,差距好大啊
    2008-04-07 10:05 | lexus
    主站蜘蛛池模板: 亚洲AV日韩AV永久无码绿巨人| 亚洲AV无码精品蜜桃| 免费鲁丝片一级在线观看| 久久精品一区二区免费看| 四虎成人精品国产永久免费无码 | 亚洲日韩国产二区无码| 久久亚洲国产中v天仙www| 全部免费毛片在线| 暖暖在线日本免费中文| 999久久久免费精品国产| 无码少妇精品一区二区免费动态 | 最近2019中文字幕mv免费看| 最好看的中文字幕2019免费| 好紧我太爽了视频免费国产| 成年网在线观看免费观看网址| 亚洲AV综合色区无码一二三区| 亚洲不卡视频在线观看| 亚洲男女性高爱潮网站| 亚洲人成电影福利在线播放| 精品国产亚洲一区二区三区| 亚洲色偷偷综合亚洲AVYP| 亚洲成AV人网址| 亚洲国产高清精品线久久| 亚洲国产91精品无码专区| 免费真实播放国产乱子伦| 国产又大又长又粗又硬的免费视频| 无限动漫网在线观看免费| 在线视频免费观看爽爽爽| 69视频在线观看免费| 曰批全过程免费视频播放网站| 久久aa毛片免费播放嗯啊| 国产高清不卡免费视频| 久久精品中文字幕免费| 99在线热视频只有精品免费| 久久久久高潮毛片免费全部播放 | 亚洲精品无码永久中文字幕| 国产偷窥女洗浴在线观看亚洲| 亚洲视频在线精品| 亚洲成色在线综合网站| 亚洲精品无码不卡| 亚洲不卡中文字幕|