Atitit 代理CGLIB 動態代理 AspectJ靜態代理區別


 

 

 

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是模擬子類繼承的方式,一般采用前者,因為前者效率高。后者不建議使用,除非非用不可

 

AOPAspect 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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM