隨筆-200  評論-148  文章-15  trackbacks-0

          攔截器:

          1、首先要有一個目標對象,要攔截誰

          2、攔截對象,攔截器本身只是一個普通的類

          3、對目標對象所生成的一個代理對象,真正去執(zhí)行的是代理對象,代理對象也是有若干個方法

          由系統(tǒng)動態(tài)產(chǎn)生出來的,并不是我們?nèi)懗鰜淼模韺ο蟮姆椒ㄅc目標對象的方法很類似,但是

          代理對象的方法是綜合了攔截器的方法和跟你的系統(tǒng)的目標對象的方法,將其綜合起來,就形成了代

          理對象的方法,也就是說代理方法是攔截器方法與目標對象方法的一個結(jié)合體

          示例:


          新增一個類Target.java  就是我們的目標對象,在使用目標對象之前要有一個接口,要求我們向?qū)涌?br />
          編程,即先生成一個接口TargetInterface,并生成一個方法,此接口是一個普通的接口;Target類實現(xiàn)

          TargetInterface接口,在此Target就是目標對象,我們要攔截它Target

          目標有了,現(xiàn)在就是要寫個攔截器對象:Interceptor.java  在攔截器里面我們定義兩個方法:before()、

          after();其攔截器跟我們平時看到的類沒有什么太大的區(qū)別,之所以叫攔截器是其行為而言的;

          java對象的動態(tài)代理是要用到反射;生成一個處理器類MyHandler實現(xiàn)反射接口InvocationHandler

          其作用是將要處理的對象注入到這個處理器類里面來,動態(tài)的來調(diào)用。

          在MyHandler中方法invoke()方法是真正去調(diào)用的方法。


          再生成一個代理類MyProxy作用是產(chǎn)生一個代理,方法以getProxy()  得到一個代理,在此要用到

          Proxy類,通過newProxyInstance,new一個代理出來;

          理清的關(guān)系:


          Target是目標對象,是目標,代理誰

          Interceptor是攔截器,將方法動態(tài)的插入到目標對象Target方法之前或是之后去執(zhí)行

          在些Target與Interceptor互相不知道,Target不知道被誰插入,Interceptor也不知道插入到哪里。

          因此在這聲明一個MyHandler處理器,真正去調(diào)用目標對象方法,調(diào)用目標對象方法之前,執(zhí)行攔截器的before


          (),調(diào)用目標對象方法之后執(zhí)行攔截器的after();

          還有一個最重要的代理對象MyProxy,有一個getProxy()方法,傳過來目標對象,在此將目標對象set到處理器里


          面去myHandler.setObject(object);然后返回一個代理實例,通過代理實例來調(diào)用目標對象的方法,目標對象方


          法執(zhí)行之后就會去調(diào)用攔截器,則相當于攔截器對其攔截了。




          總結(jié)攔截器:

          角色:

          1、被攔截的對象或目標,目標對象的方法被攔截

          2、攔截器本身,普通的class類,行為上來說起到了攔截別人的作用

          3、代理,通過代理生成對目標對象的一個代理,執(zhí)行的不是目標對象,而是代理,在代理中已經(jīng)插入了攔截器


          ,這樣的作用是降低偶合

          目標對象與攔截器本身是互不關(guān)聯(lián)的,低偶合,通過myHandler/myporxy來偶合,在struts2中是通過xml配置文件

          來偶合的.代碼程次是不偶合的.

           


          攔截器底層實現(xiàn)就是動態(tài)代理實現(xiàn)的。

          posted on 2010-10-25 12:37 無聲 閱讀(3165) 評論(1)  編輯  收藏

          評論:
          # re: 攔截器底層實現(xiàn)原理 2016-07-02 14:35 | ttt
          政治  回復(fù)  更多評論
            

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 松滋市| 新绛县| 任丘市| 敦化市| 赣榆县| 永年县| 确山县| 石棉县| 富民县| 礼泉县| 盐津县| 离岛区| 邢台市| 墨竹工卡县| 洪泽县| 鄱阳县| 临颍县| 宿松县| 巴里| 安康市| 利川市| 金溪县| 嘉义县| 海南省| 嘉定区| 大足县| 昌图县| 静宁县| 海宁市| 平利县| 黔南| 秭归县| 雷山县| 金平| 运城市| 柏乡县| 朝阳县| 衡阳市| 遂溪县| 广州市| 临清市|