摘要:攔截器攔截器是我們開(kāi)發(fā)中接觸比較多的。今天使用動(dòng)態(tài)代理模式來(lái)實(shí)現(xiàn)攔截器。
攔截器
攔截器是我們開(kāi)發(fā)中接觸比較多的。今天使用JDK動(dòng)態(tài)代理模式來(lái)實(shí)現(xiàn)攔截器。實(shí)現(xiàn)過(guò)程我們通過(guò)代碼來(lái)展示,代碼中有相應(yīng)的解釋:
//攔截器接口 public interface Interceptor { /** * 調(diào)用真實(shí)方法之前執(zhí)行,寫(xiě)調(diào)用真實(shí)方法的前提邏輯 * @param proxy 代理對(duì)象 * @param obj 真實(shí)對(duì)象 * @param method 方法 * @param args 方法參數(shù) * @return */ public boolean before(Object proxy,Object obj,Method method,Object[] args); /** * 當(dāng)before方法結(jié)果是false時(shí),調(diào)用此方法 * @param proxy * @param obj * @param method * @param args */ public void around(Object proxy,Object obj,Method method,Object[] args); /** * 調(diào)用完真實(shí)對(duì)象或者執(zhí)行完around方法之后執(zhí)行此方法 * @param proxy * @param obj * @param method * @param args */ public void after(Object proxy,Object obj,Method method,Object[] args); }
//攔截器實(shí)現(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動(dòng)態(tài)代理所需要的接口 public interface ISayHello { public void say(); }
//JDK動(dòng)態(tài)代理接口實(shí)現(xiàn)類 public class SayHelloImpl implements ISayHello { @Override public void say() { System.out.println("真實(shí)對(duì)象邏輯~Hello World!"); } }
//jdk動(dòng)態(tài)代理實(shí)現(xiàn)攔截器 public class InterceptorJdkProxy implements InvocationHandler { //真實(shí)對(duì)象 private Object obj; //攔截器權(quán)限定名 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 { //如果沒(méi)有攔截器,直接走原邏輯 if(interceptorClass == null) { return method.invoke(obj, args); } //接收真實(shí)對(duì)象方法 Object result = null; //反射生成攔截器對(duì)象 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; } }
//測(cè)試代碼 public class TestInterceptor { public static void main(String[] args) { InterceptorJdkProxy interceptorJdkProxy = new InterceptorJdkProxy(); ISayHello bind = (ISayHello) interceptorJdkProxy.bind(new SayHelloImpl(), "interceptor.InterceptorImpl"); bind.say(); } }測(cè)試結(jié)果展示 當(dāng)執(zhí)行before方法返回為true 當(dāng)執(zhí)行before方法返回為false
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/69590.html
摘要:要明白,動(dòng)態(tài)代理類的存在意義是為了攔截方法并修改邏輯而動(dòng)態(tài)代理的局限性之一就是只能攔截接口所聲明的方法。因?yàn)閯?dòng)態(tài)代理類是繼承自業(yè)務(wù)類,所以該類和方法不能聲明成無(wú)法繼承或重寫(xiě)。者最終都是生成了一個(gè)新的動(dòng)態(tài)代理類對(duì)象。 動(dòng)態(tài)代理 1、先談靜態(tài)代理 對(duì)于靜態(tài)代理,我們已經(jīng)很熟悉了。我們擁有一個(gè)抽象類,真實(shí)類繼承自抽象類并重寫(xiě)其業(yè)務(wù)方法,代理類持有真實(shí)類的對(duì)象實(shí)例,在重寫(xiě)業(yè)務(wù)方法中通過(guò)調(diào)用真實(shí)...
摘要:與靜態(tài)代理對(duì)比,動(dòng)態(tài)代理是在動(dòng)態(tài)生成代理類,由代理類完成對(duì)具體方法的封裝,實(shí)現(xiàn)的功能。本文將分析中兩種動(dòng)態(tài)代理的實(shí)現(xiàn)方式,和,比較它們的異同。那如何動(dòng)態(tài)編譯呢你可以使用,這是一個(gè)封裝了的庫(kù),幫助你方便地實(shí)現(xiàn)動(dòng)態(tài)編譯源代碼。 發(fā)現(xiàn)Java面試很喜歡問(wèn)Spring AOP怎么實(shí)現(xiàn)的之類的問(wèn)題,所以寫(xiě)一篇文章來(lái)整理一下。關(guān)于AOP和代理模式的概念這里并不做贅述,而是直奔主題,即AOP的實(shí)現(xiàn)方...
摘要:值得一提的是由于采用動(dòng)態(tài)創(chuàng)建子類的方式生成代理對(duì)象,所以不能對(duì)目標(biāo)類中的方法進(jìn)行代理。動(dòng)態(tài)代理中生成的代理類是子類,調(diào)試的時(shí)候可以看到,打開(kāi)源碼可看到實(shí)現(xiàn)了和也就實(shí)現(xiàn)方法。 前面講到了動(dòng)態(tài)代理的底層原理,接下來(lái)我們來(lái)看一下aop的動(dòng)態(tài)代理.Spring AOP使用了兩種代理機(jī)制:一種是基于JDK的動(dòng)態(tài)代理,一種是基于CGLib的動(dòng)態(tài)代理. ①JDK動(dòng)態(tài)代理:使用JDK創(chuàng)建代理有一個(gè)限制...
摘要:我是一個(gè)很喜歡偷懶的程序猿,一看代理的定義,哇塞,還有這么好的事情居然可以委托別人替我干活那么倒底是不是這樣呢別著急,仔細(xì)看看本文關(guān)于代理技術(shù)的介紹,最后我會(huì)專門(mén)回過(guò)頭來(lái)解釋這個(gè)問(wèn)題的。 代理,或者稱為 Proxy ,簡(jiǎn)單理解就是事情我不用去做,由其他人來(lái)替我完成。在黃勇《架構(gòu)探險(xiǎn)》一書(shū)中,我覺(jué)得很有意思的一句相關(guān)介紹是這么說(shuō)的: 賺錢(qián)方面,我就是我老婆的代理;帶小孩方面,我老婆就是我...
摘要:是一種特殊的增強(qiáng)切面切面由切點(diǎn)和增強(qiáng)通知組成,它既包括了橫切邏輯的定義也包括了連接點(diǎn)的定義。實(shí)際上,一個(gè)的實(shí)現(xiàn)被拆分到多個(gè)類中在中聲明切面我們知道注解很方便,但是,要想使用注解的方式使用就必須要有源碼因?yàn)槲覀円? 前言 只有光頭才能變強(qiáng) 上一篇已經(jīng)講解了Spring IOC知識(shí)點(diǎn)一網(wǎng)打盡!,這篇主要是講解Spring的AOP模塊~ 之前我已經(jīng)寫(xiě)過(guò)一篇關(guān)于AOP的文章了,那篇把比較重要的知...
閱讀 2084·2023-04-25 17:57
閱讀 1290·2021-11-24 09:39
閱讀 2488·2019-08-29 16:39
閱讀 3317·2019-08-29 13:44
閱讀 3135·2019-08-29 13:14
閱讀 2324·2019-08-26 11:36
閱讀 3819·2019-08-26 11:00
閱讀 953·2019-08-26 10:14