日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

用 Java 实现拦截器 Interceptor 的拦截功能

發(fā)布時(shí)間:2024/1/8 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用 Java 实现拦截器 Interceptor 的拦截功能 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

此外,攔截器在流行的開源框架中也很常見,其依賴的技術(shù)就是 Java 的動(dòng)態(tài)代理。理解攔截器的核心原理對(duì)理解這些開源框架的體系結(jié)構(gòu)至關(guān)重要。下面,我們就以一個(gè)簡單的模型的來說明攔截器實(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í)行自己的一些方法;
  • 客戶端,執(zhí)行業(yè)務(wù)處理的入口。

接下來,我們就用 Java 語言來實(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)類 BusinessClass

/*** @author 維C果糖* @create 2017-03-30** GitHub:github.com/guobinhit** 業(yè)務(wù)組件接口的實(shí)現(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)建動(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è)代理類對(duì)象,并綁定被代理類和代理處理器。** @param business* @return 代理類對(duì)象*/public Object bind(Object business) {this.business = business;/*** Proxy.newProxyInstance(參數(shù)1, 參數(shù)2, 參數(shù)3)** 參數(shù)1, 表示被代理類的 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 代理類對(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)建客戶端 ClientDemo

/*** @author 維C果糖* @create 2017-03-30** GitHub:github.com/guobinhit** 客戶端*/ 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)代理綁定代理類BusinessFacade businessProxy = (BusinessFacade) handler.bind(business);// 調(diào)用業(yè)務(wù)組件中的方法,演示攔截器效果businessProxy.doSomething();} }

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

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

通過這篇文章,我們可能會(huì)對(duì)攔截器的實(shí)現(xiàn)原理有一個(gè)更透徹的理解。But,在真正的項(xiàng)目實(shí)踐之中,要想實(shí)現(xiàn)攔截器的功能,我們一般采用繼承類HandlerInterceptorAdapter或者抽象類AbstractInterceptor,或者實(shí)現(xiàn)HandleInterceptor接口。也就是說,我們只需要關(guān)心如何重寫方法,而不需要關(guān)心其內(nèi)部的實(shí)現(xiàn)原理。

總結(jié)

以上是生活随笔為你收集整理的用 Java 实现拦截器 Interceptor 的拦截功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。