欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

模型主要分為五個(gè)模塊,分別:

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

接下來(lái),我們就用 Java 語(yǔ)言來(lái)實(shí)現(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ù)組件實(shí)現(xiàn)類(lèi) BusinessClass

/**
 * @author 維C果糖
 * @create 2017-03-30
 *
 * GitHub:github.com/guobinhit
 *
 * 業(yè)務(wù)組件接口的實(shí)現(xiàn)類(lèi)
 */
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)建動(dòng)態(tài)代理處理器工具 DynamicProxyHandler

/**
 * @author 維C果糖
 * @create 2017-03-30
 *
 * GitHub:github.com/guobinhit
 *
 * 動(dòng)態(tài)代理處理器工具
 */
public class DynamicProxyHandler implements InvocationHandler {
    // 聲明被代理對(duì)象
    private Object business;
    // 創(chuàng)建攔截器
    private InterceptorClass interceptor = new InterceptorClass();
    /**
   * 動(dòng)態(tài)生成一個(gè)代理類(lèi)對(duì)象,并綁定被代理類(lèi)和代理處理器。
   *
   * @param business
   * @return 代理類(lèi)對(duì)象
   */
    public Object bind(Object business) {
        this.business = business;
        /**
         * Proxy.newProxyInstance(參數(shù)1, 參數(shù)2, 參數(shù)3)
         *
         * 參數(shù)1, 表示被代理類(lèi)的 ClassLoader
         * 參數(shù)2, 表示被代理的接口
         * 參數(shù)3, 表示代理處理器對(duì)象
         *
         * 該方法,返回代理實(shí)例
         */
        return Proxy.newProxyInstance(business.getClass().getClassLoader(),
                business.getClass().getInterfaces(),
                this);
    }
    /**
   * 代理需要調(diào)用的方法,并在該方法調(diào)用前后,先調(diào)用連接器的方法。
   *
   * @param proxy 代理類(lèi)對(duì)象
   * @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)建客戶(hù)端 ClientDemo

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

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

1

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

通過(guò)這篇文章,我們可能會(huì)對(duì)攔截器的實(shí)現(xiàn)原理有一個(gè)更透徹的理解。

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

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

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

相關(guān)文章

  • Spring boot2X負(fù)載均衡和反向代理實(shí)現(xiàn)過(guò)程解析

    Spring boot2X負(fù)載均衡和反向代理實(shí)現(xiàn)過(guò)程解析

    這篇文章主要介紹了Spring boot2X負(fù)載均衡和反向代理實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 解決maven加載依賴(lài)時(shí)遇到的問(wèn)題

    解決maven加載依賴(lài)時(shí)遇到的問(wèn)題

    這篇文章主要介紹了解決maven加載依賴(lài)時(shí)遇到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • mybatis條件語(yǔ)句中帶數(shù)組參數(shù)的處理

    mybatis條件語(yǔ)句中帶數(shù)組參數(shù)的處理

    這篇文章主要介紹了mybatis條件語(yǔ)句中帶數(shù)組參數(shù)的處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 簡(jiǎn)單了解java自定義和自然排序

    簡(jiǎn)單了解java自定義和自然排序

    這篇文章主要介紹了簡(jiǎn)單了解java自定義和自然排序,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • SpringBoot實(shí)現(xiàn)單文件上傳

    SpringBoot實(shí)現(xiàn)單文件上傳

    這篇文章主要為大家詳細(xì)介紹了SpringBoot實(shí)現(xiàn)單文件上傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • java如何獲取byte的高四位和低四位

    java如何獲取byte的高四位和低四位

    這篇文章主要介紹了java如何獲取byte的高四位和低四位,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Springboot視頻接口報(bào)大量的ClientAbortException找不到原因的解決

    Springboot視頻接口報(bào)大量的ClientAbortException找不到原因的解決

    本文主要介紹了Springboot視頻接口報(bào)大量的ClientAbortException找不到原因的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • Java從同步容器到并發(fā)容器的操作過(guò)程

    Java從同步容器到并發(fā)容器的操作過(guò)程

    這篇文章主要介紹了Java從同步容器到并發(fā)容器的操作過(guò)程,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-10-10
  • SpringMVC使用第三方組件實(shí)現(xiàn)文件上傳

    SpringMVC使用第三方組件實(shí)現(xiàn)文件上傳

    這篇文章主要介紹了SpringMVC使用第三方組件實(shí)現(xiàn)文件上傳,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Springboot幾種任務(wù)的整合方法

    Springboot幾種任務(wù)的整合方法

    這篇文章主要介紹了Springboot幾種任務(wù)的整合方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10

最新評(píng)論