javascript
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静态代理和动态代理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多线程:同步和异步的优缺点比较
- 下一篇: 框架:Servlet的生命周期