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

歡迎訪問 生活随笔!

生活随笔

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

javascript

SpringAOP静态代理和动态代理

發布時間:2025/3/21 javascript 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringAOP静态代理和动态代理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

代理模式應用于SpringAOP。

SpringAOP。即面向切面的編程范式。多用于權限控制,異常處理,日志管理等場景。主要作用是分離功能性需求和非功能性需求,減少代碼冗余。我們在使用的時候可以集中處理某一個關注點或者橫切邏輯;可以很方便地添加/刪除關注點,減少對業務代碼的侵入,增強代碼的可讀性和可維護性。

SpringAOP是基于代理模式設計的,代理模式又分為靜態代理和動態代理。靜態代理是設計模式中的傳統的代理模式。傳統的靜態代理會產生很多代碼冗余。目標類和代理類共同實現接口的方法。當我們一個類有很多方法要委托給代理進行執行的時候,或者當我們的目標類有新增了接口的實現方法時,就要不斷的修改代理類。這是不合理的,甚至當這些方法的代理邏輯都相同的時候,就會重復很多代碼。為了解決這個問題基于反射機機制的動態代理模式就出現了。

動態代理模式分為兩種:

1)基于接口的JDK動態代理。

實現InvocationHandler的invoke方法。

客戶端使用Java.lang.reflect.Proxy動態代理類產生動態代理類的對象。

newProxyInstance實現過程:獲得字節碼(getProxyClass0/ClassFactoryProxy/proxygenerator)---創建對象(newInstance)

注意,接口類的Class是一個數組,也就是支持不同的接口的方法。也就是說,代理類在之后就無需修改。

2)基于繼承的CGlib的動態代理

如果目標類沒有實現接口,那就要選擇使用CGLIB來動態代理目標類,有接口也行。

編寫織入邏輯方法,要實現MethodInterceptor,重寫intercept方法

這里說的繼承是讓動態產生的代理繼承目標類。

setSupperClass()? ?將代理類繼承目標類;

setCallback()? ?織入代理邏輯方法(實現MethodInterceptor方法)

create()? 創建動態代理類


CGLIB會讓生成的代理類繼承當前對象,

并在代理類中對代理方法進行強化處理(前置處理、后置處理等)。
在CGLIB底層 底層實現是通過ASM字節碼處理框架來轉換字節碼并生成新的代理類

注意,CGLIB是通過繼承的方式做的動態代理,因此如果某個類被標記為final,那么它是無法使用CGLIB做動態代理的。


JDK代理和CGlib代理得區別:

JDK基于反射機制,適用于目標類實現接口方法的場景,

CGlib基于繼承的形式,獲得目標類的所有內容。如果目標類為final、static,則無法繼承;如果方法為final、private則也無法使用CGlib.

總結

以上是生活随笔為你收集整理的SpringAOP静态代理和动态代理的全部內容,希望文章能夠幫你解決所遇到的問題。

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