Atitit 代理CGLIB 動態代理 AspectJ靜態代理區別
1.1. AOP 代理主要分為靜態代理和動態代理兩大類,靜態代理以 AspectJ 為代表;而動態代理則以 spring AOP 為代表 1
1.2. JDK動態代理是模擬接口實現的方式,cglib是模擬子類繼承的方式1
1.3. CGLIB代理模式的缺點 在static和final方法上應用橫切關注點也是無法做到的。2
1.1. AOP 代理主要分為靜態代理和動態代理兩大類,靜態代理以 AspectJ 為代表;而動態代理則以 spring AOP 為代表
CGLIB動態代理 是可以針對接口與普通類(繼承方式),底層使用ASM框架生成字節碼完成代理功能
我在網上查資料說AspectJ是靜態代理 在編譯期間就生成了class文件完成了代理。這點容易理解一種編譯的技術
因為spring支持AspectJ風格的AOP
還是動態的,標注中用到的JoinPoint等類都來自aspectj包
1.2. JDK動態代理是模擬接口實現的方式,cglib是模擬子類繼承的方式
JDK動態代理是模擬接口實現的方式,cglib是模擬子類繼承的方式,一般采用前者,因為前者效率高。后者不建議使用,除非非用不可
AOP(Aspect Orient Programming),作為面向對象編程的一種補充,廣泛應用於處理一些具有橫切性質的系統級服務,如事務管理、安全檢查、緩存、對象池管理等。AOP 實現的關鍵就在於 AOP 框架自動創建的 AOP 代理,AOP 代理則可分為靜態代理和動態代理兩大類,其中靜態代理是指使用 AOP 框架提供的命令進行編譯,從而在編譯階段就可生成 AOP 代理類,因此也稱為編譯時增強;而動態代理則在運行時借助於 JDK 動態代理、CGLIB 等在內存中“臨時”生成 AOP 動態代理類,因此也被稱為運行時增強。
區別只是生成 AOP 代理類的時機不同:AspectJ 采用編譯時生成 AOP 代理類,因此具有更好的性能,但需要使用特定的編譯器進行處理;而 Spring AOP 則采用運行時生成 AOP 代理類,因此無需使用特定編譯器進行處理。由於 Spring AOP 需要在每次運行時生成 AOP 代理,因此性能略差一些。
1.3. CGLIB代理模式的缺點 在static和final方法上應用橫切關注點也是無法做到的。
因為Spring基於代理模式(使用CGLIB),它有一個使用限制,即無法在使用final修飾的bean上應用橫切關注點。因為代理需要對Java類進行繼承,一旦使用了關鍵字final,這將是無法做到的。
例如,在Spring bean MyServicesImpl上使用關鍵字final,並配置一個“execution(public * *(..))”這樣的切入點,將導致運行時異常(exception),因為Spring不能為MyServicesImpl生成代理。
這種情況下,你也許會考慮使用AspectJ,其支持編譯期織入且不需要生成代理。
於此相似,在static和final方法上應用橫切關注點也是無法做到的。因為Spring基於代理模式。如果你在這些方法上配置通知,將導致運行時異常,因為static和final方法是不能被覆蓋的。在這種情況下,你也會考慮使用AspectJ,因為其支持編譯期織入且不需要生成代理。
AOP日志,記錄調用類、方法、方法參數名稱、方法參數值(包括對象和基本類型) - paincupid的專欄 - 博客頻道 - CSDN.NET.html
作者:: 綽號:老哇的爪子claw of Eagle 偶像破壞者Iconoclast image-smasher
簡稱 Attilax Akbar 阿提拉克斯 阿克巴
全名:Attilax bin Mahmud bin attila bin Solomon Akbar Al Rapanui
阿提拉克斯 本 馬哈茂德 本 阿提拉 本 所羅門 阿克巴 阿爾 拉帕努伊
常用名:艾提拉(艾龍), EMAIL:1466519819@qq.com
轉載請注明來源:attilax的專欄 http://www.cnblogs.com/attilax/
--Atiend