隨筆 - 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é)任誰能承擔(dān)呢,毫無疑問,歷史的重?fù)?dān)就落在了AOP身上 ;) 。下面我們來看看具體的實(shí)現(xiàn):
              OrderService已經(jīng)實(shí)現(xiàn),除了訂單的處理,沒有任何的職責(zé),為了完成事件的廣播,必須要有一個(gè)途徑能夠攔截到OrderService的所有方法調(diào)用,然后分析調(diào)用的語義(參數(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,簡直有點(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 閱讀(2835) 評(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
          主站蜘蛛池模板: 五峰| 崇仁县| 稻城县| 荃湾区| 罗甸县| 景德镇市| 阿勒泰市| 青岛市| 若羌县| 阿拉善右旗| 武定县| 子洲县| 阿克| 永胜县| 雷山县| 慈利县| 莆田市| 额济纳旗| 盘锦市| 德令哈市| 都安| 尼玛县| 东辽县| 左贡县| 清水河县| 阿合奇县| 新安县| 鲜城| 望江县| 靖边县| 阳高县| 广德县| 油尖旺区| 商城县| 泽普县| 凉城县| 临猗县| 怀远县| 安溪县| 惠安县| 海林市|