JDK動態代理與cglib區別

JDK動態代理與cglib區別:

代理模式(之前的博客寫過): https://mp.csdn.net/postedit/82844237

代理類和被代理類實現相同的接口。利用反射機制生成一個實現代理接口的匿名類,在調用具體方法前調用invokeHandler來處理。

cglib:

利用asm開源包,對代理對象類的class加載進來,通過修改其字節碼生成子類來處理,所以比動態代理快。採用的繼承,所以不能對final修飾的類進行代理。

所以

JDK動態代理只能對實現了接口的類生成代理,而不能針對類。

CGLIB是針對類實現代理,主要對指定的類生成一個子類,覆蓋其中的方法(繼承)。

那麼Spring如何選擇使用動態代理還是cglib:(實現AOP)

(1)當Bean實現接口時,使用JDK的動態代理

(2)當Bean沒有實現接口時,使用cglib,spring會自動在jdk動態代理和cglib之間轉換

(3)可以強制使用cglib,添加cglib庫,jar包 SPRING_HOME/cglib/*.jar,配置文件加入<aop:aspectj-autoproxy proxy-target-class="true"/>

參考:

https://blog.csdn.net/u013126379/article/details/52121096

https://www.cnblogs.com/bigmonkeys/p/7823268.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章