1. 程式人生 > >Spring AOP:概念

Spring AOP:概念

接口 企業 sin cglib動態代理 隔離 部分 spring框架 指定 return

什麽是AOP

AOP(Aspect Oriented Programming)意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。

AOP是軟件開發思想發展到一定階段的產物,但AOP的出現並不是要完全替代OOP,而僅作為OOP的有益補充。

AOP是有特定的應用場合的,它只適合那些具有橫切邏輯的應用場合,如性能檢測、訪問控制、事務管理及日誌記錄等。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。

AOP是一種思想,不同的廠商或企業可能有不同的實現方式。在AOP聯盟定義的AOP體系結構下有很多的實現者,例如:AspectJ、AspectWerkz、JBoss AOP、Spring AOP等。

Spring AOP 是AOP在Spring中的具體實現,它是構成Spring框架的另一個重要基石。Spring AOP構建於IoC之上,統一於Spring容器中。

AOP術語

1、 連接點(Joinpoint):一個類或一段程序代碼擁有一些具有邊界性質的特定點。
Spring只支持方法的連接點,即僅能在方法調用前、方法調用後、方法拋出異常及方法調用前後這些程序執行點織入增強。

連接點確定兩個信息:1、用方法表示的程序執行點;2、用相對位置表示的方位。
Spring使用切點對執行點進行定位,而方位則在增強類型中定義。

2、 切點(Pointcut):AOP通過“切點”定位特定的連接點。
在Spring中,切點通過org.springframework.aop.Pointcut接口進行描述,它使用類和方法作為連接點的查詢條件,Spring AOP的規則解析引擎負責解析切點所設定的查詢條件,找到對應的連接點。

因為連接點是方法執行前、執行後等包括方位信息的具體程序執行點,而切點只定位到某個方法,所以如果希望定位到具體的連接點,還需要通過方位的信息。

3、增強(Advice):增強是織入目標類連接點上的一段程序代碼。
在Spring中,增強除用於描述一段程序代碼外,還擁有另一個和連接點相關的信息,這便是執行點的方位。

結合執行點的方位信息和切點信息,就可以找到特定的連接。

正因為增強既包含用於添加到目標連接點上的一段執行邏輯,又包含用於定位連接點的方位信息,所以Spring所提供的增強接口都是帶方位名的,如:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。

4、目標對象(Target):增強邏輯的織入目標類。

5、引介(Introduction):引介是一種特殊的增強,它為類添加一些屬性和方法。

6、織入(Weaving):織入是將增強添加到目標類的具體連接點上的過程。

AOP有3種織入方式:
1)編譯期織入,需要使用特殊的Java編譯器
2)類裝載期織入,需要使用特殊的Java編譯器
3)動態代理織入,在運行期為目標類添加增強生成子類的過程

7、代理(Proxy):一個類被AOP織入增強後,就產生了一個結果類,它是融合了原類和增強邏輯的代理類。根據代理方式的不同,代理類既可以是和原類具有相同接口的類,也可能就是原類的子類。

8、切面(Aspect):切面由切點和增強(引介)組成,它既包括橫切邏輯的定義,也包括連接點的定義。

Spring AOP就是負責實施切面的框架。

代理

Spring AOP的底層就是通過使用JDK或CGLib動態代理技術為目標Bean織入橫切邏輯的。

Spring AOP通過Pointcut(切點)指定在哪些類的哪些方法上織入橫切邏輯,通過Advice(增強)描述橫切邏輯和方法的具體織入點(方法前、方法後、方法的兩端等)。此外,Spring通過Advisor(切面)將Pointcut和Advice組裝起來。有了Advisor的信息,Spring就可以利用JDK或CGLib動態代理技術采用統一的方式為目標Bean創建織入切面的代理對象。

JDK動態代理 vs CGLib動態代理

    • CGlib所創建的動態代理對象的性能高於JDK所創建的動態代理對象(約10倍)

    • CGLib在創建代理對象時所花費的時間比JDK動態代理多(約8倍)

    • 對於Singleton的代理對象或者具有實例池的代理,因為無需頻繁的創建代理對象,所以比較適合采用CGLib動態代理技術;反之則適合采用JDK動態代理技術。

Spring AOP:概念