動態代理(CGlib)
Last updated
Was this helpful?
Last updated
Was this helpful?
通過繼承方式實現代理。
實作 org.springframework.cglib.proxy.MethodInterceptor 介面。
方法呼叫會被轉發到該類別的 intercept() 方法。
通過 CGlib 動態代理 proxy.invokeSuper() 獲取代理物件。
前後加上需要的非業務內容,完成代理主要目的。
Cglib proxy.invokeSuper() 與 JDK 的 Proxy.newProxyInstance(),
差別就在 Proxy.newProxyInstance() 的介面陣列參數。
配置文件 - spring.aop.proxy-target-class=true
註解 - @EnableAspectJAutoProxy(proxyTargetClass=true)
XML - <aop:aspectj-autoproxy proxy-target-class="true"/>
JDK 動態代理:只實現了針對實現介面的類別代理,而不能針對類別 (即參數中的介面陣列)。
CGLib 動態代理:可以針對類別做代理,對指定的類別繼承生成子類別,覆寫方法(又稱增強)。
CGlib 代理的方式是繼承,所以代理的類別或方法不能聲明成 final,否則無法繼承。