一、AOP和 OOP
OOP:面向對象編程
AOP:面向切點編程
AOP的適用範圍:如性能監測、事務控制、訪問管理及事務控制等
二、AOP術語
- 連接點(JoinPoint):如類開始初始化前,類初始化後、類的某個方法執行前/執行後、方法拋出異常後。一個類或一段程序代碼擁有一些具有邊界性質的特定點,稱爲連接點。連接點由兩個信息確定:
- 用方法表示的程序執行點
- 用相對位置表示的方位:如Test.foo()方法執行前的連接點,執行點爲Test.foo(),方位爲該方法執行前的位置
- 切點(PointCut):藉助數據庫查詢的概念來理解。連接點相當於每條記錄,而切點則相當於查詢條件。一個切點可以匹配多個連接點。
- 增強(Advice):增強是織入目標類連接點上的一段程序代碼。
- 目標對象(Target):增強邏輯織入的目標類
- 引介(Introduction):引介是一種特殊的增強,它爲類添加一些特殊的屬性和方法
- 織入(Weaving):織入是將增強添加到目標類連接點上的過程,三種織入方式
- 編譯期織入:要求使用特殊的java編譯器
- 類裝載期織入:要求使用特殊的類裝載器
- 動態代理織入:在運行期爲目標類添加增強生成子類的方式
- Spring採用動態代理,而AspectJ採用編譯期織入和類裝載期織入
- 代理(Proxy):
- 切面(Aspect):由切點和 增強(引介)組成。既包含橫切邏輯的定義,也包括連接點的定義
三、SpringAOP
兩種代理機制:
- 基於JDK動態代理:只支持接口代理
- 基於CGLib動態代理:由於採用動態代理生成子類的方式,不能對目標類中的final和private方法進行代理。(比JDK動態代理的性能高出10倍左右)