最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 實現(xiàn)攔截器Interceptor的攔截功能方式

 更新時間:2021年10月30日 12:00:48   作者:CG國斌  
這篇文章主要介紹了Java 實現(xiàn)攔截器Interceptor的攔截功能方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Java 里的攔截器是動態(tài)攔截 action 調(diào)用的對象,它提供了一種機(jī)制可以使開發(fā)者可以定義在一個 action 執(zhí)行的前后執(zhí)行的代碼,也可以在一個 action 執(zhí)行前阻止其執(zhí)行,同時也提供了一種可以提取 action 中可重用部分的方式。在 AOP(Aspect-Oriented Programming)中攔截器用于在某個方法或字段被訪問之前進(jìn)行攔截,然后在之前或之后加入某些操作。

此外,攔截器在流行的開源框架中也很常見,其依賴的技術(shù)就是 Java 的動態(tài)代理。理解攔截器的核心原理對理解這些開源框架的體系結(jié)構(gòu)至關(guān)重要。下面,我們就以一個簡單的模型的來說明攔截器實現(xiàn)的一般方法。

模型主要分為五個模塊,分別:

  • 業(yè)務(wù)組件,被代理和被攔截的對象;
  • 代理處理器,實現(xiàn)了InvocationHandler接口的一個對象;
  • 代理對象,Proxy對象;
  • 攔截器,普通的 Java Bean,在調(diào)用業(yè)務(wù)方法之前或者之后會自動攔截并執(zhí)行自己的一些方法;
  • 客戶端,執(zhí)行業(yè)務(wù)處理的入口。

接下來,我們就用 Java 語言來實現(xiàn)攔截器Interceptor的攔截功能:

第1步:創(chuàng)建業(yè)務(wù)組件接口 BusinessFacade

/**
 * @author 維C果糖
 * @create 2017-03-30
 *
 * GitHub:github.com/guobinhit
 *
 * 業(yè)務(wù)組件接口
 */
public interface BusinessFacade {
    public void doSomething();
}

第2步:創(chuàng)建業(yè)務(wù)組件實現(xiàn)類 BusinessClass

/**
 * @author 維C果糖
 * @create 2017-03-30
 *
 * GitHub:github.com/guobinhit
 *
 * 業(yè)務(wù)組件接口的實現(xiàn)類
 */
public class BusinessClass implements BusinessFacade {
    public void doSomething() {
        System.out.println("在業(yè)務(wù)組件 BusinessClass 中調(diào)用方法: doSomething()");
    }
}

第3步:創(chuàng)建攔截器 InterceptorClass

/**
 * @author 維C果糖
 * @create 2017-03-30
 *
 * GitHub:github.com/guobinhit
 *
 * 攔截器
 */
public class InterceptorClass {
    // 在 action 之前調(diào)用
    public void before(){
        System.out.println("在攔截器 InterceptorClass 中調(diào)用方法: before()");
    }
    // 在 action 之后調(diào)用
    public void after(){
        System.out.println("在攔截器 InterceptorClass 中調(diào)用方法: after()");
    }
}

第4步:創(chuàng)建動態(tài)代理處理器工具 DynamicProxyHandler

/**
 * @author 維C果糖
 * @create 2017-03-30
 *
 * GitHub:github.com/guobinhit
 *
 * 動態(tài)代理處理器工具
 */
public class DynamicProxyHandler implements InvocationHandler {
    // 聲明被代理對象
    private Object business;
    // 創(chuàng)建攔截器
    private InterceptorClass interceptor = new InterceptorClass();
    /**
   * 動態(tài)生成一個代理類對象,并綁定被代理類和代理處理器。
   *
   * @param business
   * @return 代理類對象
   */
    public Object bind(Object business) {
        this.business = business;
        /**
         * Proxy.newProxyInstance(參數(shù)1, 參數(shù)2, 參數(shù)3)
         *
         * 參數(shù)1, 表示被代理類的 ClassLoader
         * 參數(shù)2, 表示被代理的接口
         * 參數(shù)3, 表示代理處理器對象
         *
         * 該方法,返回代理實例
         */
        return Proxy.newProxyInstance(business.getClass().getClassLoader(),
                business.getClass().getInterfaces(),
                this);
    }
    /**
   * 代理需要調(diào)用的方法,并在該方法調(diào)用前后,先調(diào)用連接器的方法。
   *
   * @param proxy 代理類對象
   * @param method 被代理的接口方法
   * @param args 被代理接口方法的參數(shù)
   * @return 方法調(diào)用返回的結(jié)果
   * @throws Throwable
   */
   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
       Object result = null;
       interceptor.before();
       result = method.invoke(business, args);
       interceptor.after();
       return null;
   }
}

第5步:創(chuàng)建客戶端 ClientDemo

/**
 * @author 維C果糖
 * @create 2017-03-30
 *
 * GitHub:github.com/guobinhit
 *
 * 客戶端
 */
public class ClientDemo {
    public static void main(String args[]) {
        // 創(chuàng)建動態(tài)代理處理工具
        DynamicProxyHandler handler = new DynamicProxyHandler();
        // 創(chuàng)建業(yè)務(wù)組件對象
        BusinessFacade business = new BusinessClass();
        // 創(chuàng)建業(yè)務(wù)組件對象,并用動態(tài)代理綁定代理類
        BusinessFacade businessProxy = (BusinessFacade) handler.bind(business);
        // 調(diào)用業(yè)務(wù)組件中的方法,演示攔截器效果
        businessProxy.doSomething();
    }
}

運(yùn)行上面的項目代碼,結(jié)果如下圖所示:

1

如上圖所示,顯然我們攔截器的攔截功能實現(xiàn)啦!

通過這篇文章,我們可能會對攔截器的實現(xiàn)原理有一個更透徹的理解。

But,在真正的項目實踐之中,要想實現(xiàn)攔截器的功能,我們一般采用繼承類HandlerInterceptorAdapter或者抽象類AbstractInterceptor,或者實現(xiàn)HandleInterceptor接口。

也就是說,我們只需要關(guān)心如何重寫方法,而不需要關(guān)心其內(nèi)部的實現(xiàn)原理。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java 全角半角字符轉(zhuǎn)換的方法實例

    java 全角半角字符轉(zhuǎn)換的方法實例

    這篇文章主要介紹了java 全角半角字符轉(zhuǎn)換的方法,大家參考使用吧
    2013-11-11
  • Java設(shè)計模式系列之深入淺出單例模式

    Java設(shè)計模式系列之深入淺出單例模式

    設(shè)計模式是在大量的實踐中總結(jié)和理論之后優(yōu)選的代碼結(jié)構(gòu),編程風(fēng)格,以及解決問題的思考方式,下面這篇文章主要給大家介紹了關(guān)于Java設(shè)計模式系列之深入淺出單例模式的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • Spring Cloud LoadBalancer 負(fù)載均衡詳解

    Spring Cloud LoadBalancer 負(fù)載均衡詳解

    本文介紹了如何在Spring Cloud中使用SpringCloudLoadBalancer實現(xiàn)客戶端負(fù)載均衡,并詳細(xì)講解了輪詢策略和隨機(jī)策略的配置方法,此外,還提供了部署到云服務(wù)器并在多個實例之間進(jìn)行負(fù)載均衡的步驟,感興趣的朋友一起看看吧
    2025-02-02
  • 詳解Java的Hibernate框架中的set映射集與SortedSet映射

    詳解Java的Hibernate框架中的set映射集與SortedSet映射

    這篇文章主要介紹了詳解Java的Hibernate框架中的set映射集與SortedSet映射,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-12-12
  • 聊聊為什么要使用BufferedReader讀取File

    聊聊為什么要使用BufferedReader讀取File

    這篇文章主要介紹了為什么要使用BufferedReader讀取File,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java編程刪除鏈表中重復(fù)的節(jié)點問題解決思路及源碼分享

    Java編程刪除鏈表中重復(fù)的節(jié)點問題解決思路及源碼分享

    這篇文章主要介紹了Java編程刪除鏈表中重復(fù)的節(jié)點問題解決思路及源碼分享,具有一定參考價值,這里分享給大家,供需要的朋友了解。
    2017-10-10
  • springboot后端存儲富文本內(nèi)容的思路與步驟(含圖片內(nèi)容)

    springboot后端存儲富文本內(nèi)容的思路與步驟(含圖片內(nèi)容)

    在所有的編輯器中,大概最受歡迎的就是富文本編輯器和MarkDown編輯器了,下面這篇文章主要給大家介紹了關(guān)于springboot后端存儲富文本內(nèi)容的思路與步驟的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • IDEA下SpringBoot指定環(huán)境、配置文件啟動操作過程

    IDEA下SpringBoot指定環(huán)境、配置文件啟動操作過程

    這篇文章主要介紹了IDEA下SpringBoot指定環(huán)境、配置文件啟動過程,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • web容器中實例化spring相關(guān)配置解析

    web容器中實例化spring相關(guān)配置解析

    這篇文章主要介紹了web容器中實例化spring相關(guān)配置解析,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • 詳解JavaWeb過濾器 Filter問題解決

    詳解JavaWeb過濾器 Filter問題解決

    過濾器就是對事物進(jìn)行過濾的,在Web中的過濾器,當(dāng)然就是對請求進(jìn)行過濾,我們使用過濾器,就可以對請求進(jìn)行攔截,然后做相應(yīng)的處理,實現(xiàn)許多特殊功能,今天主要給大家講解JavaWeb過濾器 Filter問題解決,感興趣的朋友一起看看吧
    2022-10-10

最新評論

兰西县| 哈尔滨市| 鄂温| 读书| 扶余县| 修水县| 威远县| 广安市| 策勒县| 白银市| 桂平市| 义马市| 青浦区| 沙田区| 亚东县| 岑溪市| 广德县| 绥滨县| 华亭县| 大埔区| 恩平市| 铅山县| 东宁县| 德阳市| 连平县| 沁水县| 丹江口市| 漠河县| 大渡口区| 桃江县| 庄河市| 浦县| 昌江| 齐齐哈尔市| 延庆县| 三台县| 民和| 敦化市| 温宿县| 绥中县| 醴陵市|