動態代理(CGlib)

Code Generation Library

必須依賴於CGLib 的 Library, 基於 ASM 的位元組碼,允許在 Runtime 時期對位元組進行修改和動態生成。

通過繼承方式實現代理。

反射(Reflection)

實作

  • 實作 org.springframework.cglib.proxy.MethodInterceptor 介面。

  • 方法呼叫會被轉發到該類別的 intercept() 方法。

  • 通過 CGlib 動態代理 proxy.invokeSuper() 獲取代理物件。

  • 前後加上需要的非業務內容,完成代理主要目的。

Spring 強制使用

  • 配置文件 - spring.aop.proxy-target-class=true

  • 註解 - @EnableAspectJAutoProxy(proxyTargetClass=true)

  • XML - <aop:aspectj-autoproxy proxy-target-class="true"/>

與 JDK 動態代理的差異?

JDK 動態代理:只實現了針對實現介面的類別代理,而不能針對類別 (即參數中的介面陣列)。

CGLib 動態代理可以針對類別做代理,對指定的類別繼承生成子類別,覆寫方法(又稱增強)。

Last updated

Was this helpful?