日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring-AOP动态代理技术(底层代码)

發布時間:2024/10/5 javascript 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring-AOP动态代理技术(底层代码) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.JDK代理:基于接口的動態代理技術

目標對象必須有接口,目標對象有什么方法,目標接口就有什么方法,
運行期間基于接口動態生成代理對象,所以代理對象也就有目標對象同樣的方法。

注意:以下代碼只是底層jdk動態代理實現的方式,我們在開發過程中只需要在配置文件中進行配置即可,這些代碼spring會幫你自動生成(這是模擬底層)

(1)創建接口及其實現類

public interface TargetInterface {public void save(); } public class Target implements TargetInterface{@Overridepublic void save() {System.out.println("save running....");} }

(2)創建增強的方法

public class Advice {public void before(){System.out.println("前置增強");}public void after(){System.out.println("后置增強");} }

(3)測試實現

public class ProxyTest {public static void main(String[] args) {//目標對象final Target target=new Target();//增強對象final Advice advice=new Advice();TargetInterface proxy= (TargetInterface) Proxy.newProxyInstance(//目標對象類加載器target.getClass().getClassLoader(),//目標對象相同的接口字節碼對象數組target.getClass().getInterfaces(),//調用代理對象的任何方法,實質執行的都是invoke方法new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {advice.before();//前置增強//執行目標方法Object invoke = method.invoke(target, args);advice.after(); //后置增強return invoke;}});//調用代理方法proxy.save();} }





2.cglib代理:基于父類的動態代理技術

基于目標對象動態生成一個代理對象,類似于繼承(但不是繼承),代理對象內部調用目標對象,在調用目標對象之前或者之后介入一些其他代碼,從而完成的增強。
(1)創建目標對象類

public class Target {public void save() {System.out.println("save running....");} }

(2)創建增強類

public class Advice {public void before(){System.out.println("前置增強");}public void after(){System.out.println("后置增強");} }

3.底層實現

public class ProxyTest {public static void main(String[] args) {//目標對象final Target target=new Target();//增強對象final Advice advice=new Advice();//返回值 就是動態生成的代理對象,基于cglib//1.創建增強器Enhancer enhancer=new Enhancer();//2.設置父類(目標對象)enhancer.setSuperclass(Target.class);//3.設置回調enhancer.setCallback(new MethodInterceptor() {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {advice.before(); //執行前置Object invoke = method.invoke(target, objects);advice.after(); //執行后置return invoke;}});//4.生成代理對象Target proxy= (Target) enhancer.create();proxy.save();} }

結果:
前置增強
save running…
后置增強

總結

以上是生活随笔為你收集整理的Spring-AOP动态代理技术(底层代码)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。