国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java 實現攔截器Interceptor的攔截功能方式

Java 實現攔截器Interceptor的攔截功能方式

2022-03-07 00:46CG國斌 Java教程

這篇文章主要介紹了Java 實現攔截器Interceptor的攔截功能方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

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

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

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

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

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

第1步:創建業務組件接口 BusinessFacade

?
1
2
3
4
5
6
7
8
9
10
11
/**
 * @author 維C果糖
 * @create 2017-03-30
 *
 * GitHub:github.com/guobinhit
 *
 * 業務組件接口
 */
public interface BusinessFacade {
    public void doSomething();
}

第2步:創建業務組件實現類 BusinessClass

?
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
 * @author 維C果糖
 * @create 2017-03-30
 *
 * GitHub:github.com/guobinhit
 *
 * 業務組件接口的實現類
 */
public class BusinessClass implements BusinessFacade {
    public void doSomething() {
        System.out.println("在業務組件 BusinessClass 中調用方法: doSomething()");
    }
}

第3步:創建攔截器 InterceptorClass

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
 * @author 維C果糖
 * @create 2017-03-30
 *
 * GitHub:github.com/guobinhit
 *
 * 攔截器
 */
public class InterceptorClass {
    // 在 action 之前調用
    public void before(){
        System.out.println("在攔截器 InterceptorClass 中調用方法: before()");
    }
    // 在 action 之后調用
    public void after(){
        System.out.println("在攔截器 InterceptorClass 中調用方法: after()");
    }
}

第4步:創建動態代理處理器工具 DynamicProxyHandler

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/**
 * @author 維C果糖
 * @create 2017-03-30
 *
 * GitHub:github.com/guobinhit
 *
 * 動態代理處理器工具
 */
public class DynamicProxyHandler implements InvocationHandler {
    // 聲明被代理對象
    private Object business;
    // 創建攔截器
    private InterceptorClass interceptor = new InterceptorClass();
    /**
   * 動態生成一個代理類對象,并綁定被代理類和代理處理器。
   *
   * @param business
   * @return 代理類對象
   */
    public Object bind(Object business) {
        this.business = business;
        /**
         * Proxy.newProxyInstance(參數1, 參數2, 參數3)
         *
         * 參數1, 表示被代理類的 ClassLoader
         * 參數2, 表示被代理的接口
         * 參數3, 表示代理處理器對象
         *
         * 該方法,返回代理實例
         */
        return Proxy.newProxyInstance(business.getClass().getClassLoader(),
                business.getClass().getInterfaces(),
                this);
    }
    /**
   * 代理需要調用的方法,并在該方法調用前后,先調用連接器的方法。
   *
   * @param proxy 代理類對象
   * @param method 被代理的接口方法
   * @param args 被代理接口方法的參數
   * @return 方法調用返回的結果
   * @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步:創建客戶端 ClientDemo

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
 * @author 維C果糖
 * @create 2017-03-30
 *
 * GitHub:github.com/guobinhit
 *
 * 客戶端
 */
public class ClientDemo {
    public static void main(String args[]) {
        // 創建動態代理處理工具
        DynamicProxyHandler handler = new DynamicProxyHandler();
        // 創建業務組件對象
        BusinessFacade business = new BusinessClass();
        // 創建業務組件對象,并用動態代理綁定代理類
        BusinessFacade businessProxy = (BusinessFacade) handler.bind(business);
        // 調用業務組件中的方法,演示攔截器效果
        businessProxy.doSomething();
    }
}

運行上面的項目代碼,結果如下圖所示:

Java 實現攔截器Interceptor的攔截功能方式

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

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

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

也就是說,我們只需要關心如何重寫方法,而不需要關心其內部的實現原理。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/qq_35246620/article/details/68484407

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲精品视频在线免费 | 中文字幕亚洲一区二区三区 | 亚洲在线精品视频 | 日韩一区二区不卡 | 91视频8mav| 91久久国产综合久久91精品网站 | 无码日韩精品一区二区免费 | 伊人春色在线播放 | 日韩电影免费观看 | 久久精品久久久久电影 | 日本久久精品视频 | 久久日韩 | 亚洲福利一区 | 欧美一区不卡 | 国产精品国产自产拍高清av | 日本久久国产 | 色婷婷精品久久二区二区蜜臂av | 欧美国产一区二区三区 | 久久久久一区二区三区 | 欧美不卡 | 伊人春色网 | 国产美女视频网站 | 国产欧美精品区一区二区三区 | 午夜影视| 在线视频国产一区 | 亚洲国产视频一区二区 | 天堂资源最新在线 | 久久久久久网站 | 一区二区在线不卡 | 天天澡天天狠天天天做 | 午夜精品久久久久久久久久久久 | 中文字幕在线观看日本 | 精品国产一区二区三区在线观看 | 精品国产一区二区 | 黄视频网站在线观看 | 日韩精品免费在线视频 | 久久久精品播放 | 精品日韩一区二区三区 | 9999777做爰| 欧美一级欧美三级在线观看 | 久久免费视频3 |