您好,登錄后才能下訂單哦!
本篇文章為大家展示了Java實現(xiàn)攔截器Interceptor的攔截功能方式是怎么樣的,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
Java 里的攔截器是動態(tài)攔截 action 調(diào)用的對象,它提供了一種機制可以使開發(fā)者可以定義在一個 action 執(zhí)行的前后執(zhí)行的代碼,也可以在一個 action 執(zhí)行前阻止其執(zhí)行,同時也提供了一種可以提取 action 中可重用部分的方式。在 AOP(Aspect-Oriented Programming)中攔截器用于在某個方法或字段被訪問之前進行攔截,然后在之前或之后加入某些操作。
此外,攔截器在流行的開源框架中也很常見,其依賴的技術(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的攔截功能:
/** * @author 維C果糖 * @create 2017-03-30 * * GitHub:github.com/guobinhit * * 業(yè)務(wù)組件接口 */ public interface BusinessFacade { public void doSomething(); }
/** * @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()"); } }
/** * @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()"); } }
/** * @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; } }
/** * @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(); } }
運行上面的項目代碼,結(jié)果如下圖所示:
如上圖所示,顯然我們攔截器的攔截功能實現(xiàn)啦!
通過這篇文章,我們可能會對攔截器的實現(xiàn)原理有一個更透徹的理解。
But,在真正的項目實踐之中,要想實現(xiàn)攔截器的功能,我們一般采用繼承類HandlerInterceptorAdapter或者抽象類AbstractInterceptor,或者實現(xiàn)HandleInterceptor接口。
也就是說,我們只需要關(guān)心如何重寫方法,而不需要關(guān)心其內(nèi)部的實現(xiàn)原理。
上述內(nèi)容就是Java實現(xiàn)攔截器Interceptor的攔截功能方式是怎么樣的,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。