Aop動態(tài)代理和cglib實現(xiàn)代碼詳解
一般我們使用Aop對象時,常用動態(tài)代理模式,即是采用映射一個相同的類在此基礎上進行前置后置操作。
動態(tài)代理多是采用原類實現(xiàn)父類接口,然后動態(tài)代理一個和原類相同的雙胞胎兄弟類來實現(xiàn)映射。
父類
public interface InterF { public void save(); }
需要映射的類
public class Origin implements InterF{ @Override public void save() { System.out.println("測試一下"); } }
動態(tài)代理映射,此類需要傳入相應的原類對象
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * @author bai * @create 2019-10-25-16:47 */ public class ProxyJdk implements InvocationHandler { private Object target; public Object getProxy(Object target){ this.target=target; return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("我來了"); Object invoke = method.invoke(target, args); System.out.println("我走了"); return invoke; } }
測試類
public class Mytest { public static void main(String[] args) { Origin o=new Origin(); ProxyJdk pj=new ProxyJdk(); InterF proxy = (InterF) pj.getProxy(o); proxy.save(); } }
復制代碼
cglib模式的代理和動態(tài)代理大同小異,模式上相同,但cglib采用的是直接實現(xiàn)父子類,繼承原類來實現(xiàn)映射。
原類
public class Origin{ public void save() { System.out.println("測試一下"); } }
cglib映射類,此類也需要傳入原類
import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /** * @author bai * @create 2019-10-25-17:26 */ public class CglibProxy implements MethodInterceptor{ private Object target;//被代理目標 public Object getProxy(Object target){ this.target=target; Enhancer enhancer = new Enhancer(); //1.設置基類 enhancer.setSuperclass(target.getClass()); //2.設置回調(diào)接口 enhancer.setCallback(this);//MethodInterceptor實現(xiàn)類 //3.創(chuàng)建動態(tài)代理 return enhancer.create(); } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("準備前"); Object invoke = method.invoke(target, objects); System.out.println("準備后"); return invoke; } }
o是傳入的對象,method是相應的切點所切方法,objects即參數(shù)。
測試類
public class Mytest2 { public static void main(String[] args) { Origin o=new Origin(); CglibProxy cp=new CglibProxy(); Origin proxy = (Origin) cp.getProxy(o); proxy.save(); } }
cglib相對于動態(tài)代理少了一個父類,更加便捷。且cglib使用時需要導入相應的jar包
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
OpenFeign調(diào)用服務請求頭丟失Token的解決
這篇文章主要介紹了OpenFeign調(diào)用服務請求頭丟失Token的解決方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06SpringBoot優(yōu)化啟動速度的方法實現(xiàn)
本篇文章主要介紹了SpringBoot優(yōu)化啟動速度的方法實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01SpringMVC異步處理操作(Callable和DeferredResult)
這篇文章主要介紹了SpringMVC異步處理操作(Callable和DeferredResult),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01JavaWeb項目打開網(wǎng)頁出現(xiàn)Session Error的異常解決方案
這篇文章主要介紹了JavaWeb項目打開網(wǎng)頁出現(xiàn)Session Error的異常解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-10-10