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