摘要:攔截器攔截器是我們開發(fā)中接觸比較多的。今天使用動態(tài)代理模式來實現(xiàn)攔截器。
攔截器
攔截器是我們開發(fā)中接觸比較多的。今天使用JDK動態(tài)代理模式來實現(xiàn)攔截器。實現(xiàn)過程我們通過代碼來展示,代碼中有相應的解釋:
//攔截器接口 public interface Interceptor { /** * 調(diào)用真實方法之前執(zhí)行,寫調(diào)用真實方法的前提邏輯 * @param proxy 代理對象 * @param obj 真實對象 * @param method 方法 * @param args 方法參數(shù) * @return */ public boolean before(Object proxy,Object obj,Method method,Object[] args); /** * 當before方法結果是false時,調(diào)用此方法 * @param proxy * @param obj * @param method * @param args */ public void around(Object proxy,Object obj,Method method,Object[] args); /** * 調(diào)用完真實對象或者執(zhí)行完around方法之后執(zhí)行此方法 * @param proxy * @param obj * @param method * @param args */ public void after(Object proxy,Object obj,Method method,Object[] args); }
//攔截器實現(xiàn)類 public class InterceptorImpl implements Interceptor { @Override public boolean before(Object proxy, Object obj, Method method, Object[] args) { System.out.println("反射方法執(zhí)行之前的邏輯~~"); return false; } @Override public void around(Object proxy, Object obj, Method method, Object[] args) { System.out.println("執(zhí)行around方法~~~"); } @Override public void after(Object proxy, Object obj, Method method, Object[] args) { System.out.println("反射方法之后的邏輯~~"); } }
//JDK動態(tài)代理所需要的接口 public interface ISayHello { public void say(); }
//JDK動態(tài)代理接口實現(xiàn)類 public class SayHelloImpl implements ISayHello { @Override public void say() { System.out.println("真實對象邏輯~Hello World!"); } }
//jdk動態(tài)代理實現(xiàn)攔截器 public class InterceptorJdkProxy implements InvocationHandler { //真實對象 private Object obj; //攔截器權限定名 private String interceptorClass = null; public Object bind(Object obj,String interceptorClas) { this.obj = obj; this.interceptorClass = interceptorClas; Object proxy = Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this); return proxy; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //如果沒有攔截器,直接走原邏輯 if(interceptorClass == null) { return method.invoke(obj, args); } //接收真實對象方法 Object result = null; //反射生成攔截器對象 Interceptor interceptor = (Interceptor) Class.forName(interceptorClass).newInstance(); if(interceptor.before(proxy, obj, method, args)) { result = method.invoke(obj, args); } else { interceptor.around(proxy, obj, method, args); } interceptor.after(proxy, obj, method, args); return result; } }
//測試代碼 public class TestInterceptor { public static void main(String[] args) { InterceptorJdkProxy interceptorJdkProxy = new InterceptorJdkProxy(); ISayHello bind = (ISayHello) interceptorJdkProxy.bind(new SayHelloImpl(), "interceptor.InterceptorImpl"); bind.say(); } }測試結果展示 當執(zhí)行before方法返回為true 當執(zhí)行before方法返回為false
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/69590.html
摘要:要明白,動態(tài)代理類的存在意義是為了攔截方法并修改邏輯而動態(tài)代理的局限性之一就是只能攔截接口所聲明的方法。因為動態(tài)代理類是繼承自業(yè)務類,所以該類和方法不能聲明成無法繼承或重寫。者最終都是生成了一個新的動態(tài)代理類對象。 動態(tài)代理 1、先談靜態(tài)代理 對于靜態(tài)代理,我們已經(jīng)很熟悉了。我們擁有一個抽象類,真實類繼承自抽象類并重寫其業(yè)務方法,代理類持有真實類的對象實例,在重寫業(yè)務方法中通過調(diào)用真實...
摘要:與靜態(tài)代理對比,動態(tài)代理是在動態(tài)生成代理類,由代理類完成對具體方法的封裝,實現(xiàn)的功能。本文將分析中兩種動態(tài)代理的實現(xiàn)方式,和,比較它們的異同。那如何動態(tài)編譯呢你可以使用,這是一個封裝了的庫,幫助你方便地實現(xiàn)動態(tài)編譯源代碼。 發(fā)現(xiàn)Java面試很喜歡問Spring AOP怎么實現(xiàn)的之類的問題,所以寫一篇文章來整理一下。關于AOP和代理模式的概念這里并不做贅述,而是直奔主題,即AOP的實現(xiàn)方...
摘要:值得一提的是由于采用動態(tài)創(chuàng)建子類的方式生成代理對象,所以不能對目標類中的方法進行代理。動態(tài)代理中生成的代理類是子類,調(diào)試的時候可以看到,打開源碼可看到實現(xiàn)了和也就實現(xiàn)方法。 前面講到了動態(tài)代理的底層原理,接下來我們來看一下aop的動態(tài)代理.Spring AOP使用了兩種代理機制:一種是基于JDK的動態(tài)代理,一種是基于CGLib的動態(tài)代理. ①JDK動態(tài)代理:使用JDK創(chuàng)建代理有一個限制...
摘要:是一種特殊的增強切面切面由切點和增強通知組成,它既包括了橫切邏輯的定義也包括了連接點的定義。實際上,一個的實現(xiàn)被拆分到多個類中在中聲明切面我們知道注解很方便,但是,要想使用注解的方式使用就必須要有源碼因為我們要 前言 只有光頭才能變強 上一篇已經(jīng)講解了Spring IOC知識點一網(wǎng)打盡!,這篇主要是講解Spring的AOP模塊~ 之前我已經(jīng)寫過一篇關于AOP的文章了,那篇把比較重要的知...
閱讀 2133·2023-04-25 17:57
閱讀 1315·2021-11-24 09:39
閱讀 2516·2019-08-29 16:39
閱讀 3337·2019-08-29 13:44
閱讀 3165·2019-08-29 13:14
閱讀 2348·2019-08-26 11:36
閱讀 3850·2019-08-26 11:00
閱讀 965·2019-08-26 10:14