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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring中使用动态代理(AOP)

發布時間:2025/7/14 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring中使用动态代理(AOP) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

spring是整合了BGLIB和JDK兩種動態代理

示例:使用CGLIB代理

public class MyCar {private String color = "blue";public void run() {System.out.println("我的汽車跑起來了" + color);} }

測試

public class SpringProxy {public static void main(String[] args) {//將代理類的class文件保存到本地System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "E:\\Java4IDEA\\comm_test\\com\\sun\\proxy");ProxyFactory proxyFactory = new ProxyFactory(new MyCar());//添加前后置通知addAdivce(proxyFactory);proxyFactory.setProxyTargetClass(true);MyCar proxy = (MyCar) proxyFactory.getProxy();proxy.run();} }

使用JDK代理

被代理的對象需要實現接口

public interface Car {void run(); }

調用

public static void main(String[] args) throws Exception {System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");ProxyFactory proxyFactory = new ProxyFactory(new MyCar());addAdivce(proxyFactory);// proxyFactory.setProxyTargetClass(true);Car proxy = (Car) proxyFactory.getProxy();proxy.run(); }

如果想添加前后置通知 如下

private static void addAdivce(ProxyFactory proxyFactory) {proxyFactory.addAdvice(new MethodInterceptor() {@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {Object aThis = invocation.getThis();System.out.println("MethodInterceptor前置:"+aThis);//執行被代理對象的方法,返回方法的返回值Object proceed = invocation.proceed();System.out.println("MethodInterceptor后置");return proceed;}});//可以添加多個方法前置或者后置通知proxyFactory.addAdvice(new AfterReturningAdvice() {@Overridepublic void afterReturning(Object returnValue, Method method,Object[] args, Object target) throws Throwable {System.out.println("AfterReturningAdvice后置通知");}});proxyFactory.addAdvice(new MethodBeforeAdvice() {@Overridepublic void before(Method method, Object[] args, Object target) throws Throwable {System.out.println("MethodBeforeAdvice前置通知");}});}

JDK生成的動態類

public final class $Proxy0 extends Proxy implements Car, SpringProxy, Advised, DecoratingProxy {...public final void run() throws {try {super.h.invoke(this, m3, (Object[])null);} catch (RuntimeException | Error var2) {throw var2;} catch (Throwable var3) {throw new UndeclaredThrowableException(var3);}} }

源碼與JDK的代理和CGLB的代理源碼大同小異,可以自行查閱
也可以參考 代理模式

轉載于:https://www.cnblogs.com/qiaozhuangshi/p/11185099.html

總結

以上是生活随笔為你收集整理的spring中使用动态代理(AOP)的全部內容,希望文章能夠幫你解決所遇到的問題。

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