Spring AOP

首先,直接進入主題,什麼是 AOP?

AOP(Aspect-Oriented Programming), 即 面向切面編程, 它與 OOP( Object-Oriented Programming, 面向對象編程) 相輔相成, 提供了與 OOP 不同的抽象軟件結構的視角.
在 OOP 中, 我們以類(class)作爲我們的基本單元, 而 AOP 中的基本單元是 Aspect(切面)

其次,什麼是 Aspect?

aspect 由 pointcount 和 advice 組成, 它既包含了橫切邏輯的定義, 也包括了連接點的定義. Spring AOP 就是負責實施切面的框架, 它將切面所定義的橫切邏輯編織到切面所指定的連接點中.
AOP 的工作重心在於如何將增強編織目標對象的連接點上, 這裏包含兩個工作:

  • 如何通過 pointcut 和 advice 定位到特定的 joinpoint 上

  • 如何在 advice 中編寫切面代碼.
    可以簡單地認爲, 使用 @Aspect 註解的類就是切面.

第三,什麼是切點(JoinPoint)

程序運行中的一些時間點, 例如一個方法的執行, 或者是一個異常的處理.

在 Spring AOP 中, join point 總是方法的執行點。

第四,什麼是通知(Advice)?

特定 JoinPoint 處的 Aspect 所採取的動作稱爲 Advice。Spring AOP 使用一個 Advice 作爲攔截器,在 JoinPoint “周圍”維護一系列的攔截器。

第五,有哪些類型的通知(Advice)?

  • Before - 這些類型的 Advice 在 joinpoint 方法之前執行,並使用 @Before 註解標記進行配置。

  • After Returning - 這些類型的 Advice 在連接點方法正常執行後執行,並使用@AfterReturning 註解標記進行配置。

  • After Throwing - 這些類型的 Advice 僅在 joinpoint 方法通過拋出異常退出並使用 @AfterThrowing 註解標記配置時執行。

  • After (finally) - 這些類型的 Advice 在連接點方法之後執行,無論方法退出是正常還是異常返回,並使用 @After 註解標記進行配置。

  • Around - 這些類型的 Advice 在連接點之前和之後執行,並使用 @Around 註解標記進行配置。

第六,指出在 spring aop 中 concern 和 cross-cutting concern 的不同之處。

concern 是我們想要在應用程序的特定模塊中定義的行爲。它可以定義爲我們想要實現的功能。

cross-cutting concern 是一個適用於整個應用的行爲,這會影響整個應用程序。例如,日誌記錄,安全性和數據傳輸是應用程序幾乎每個模塊都需要關注的問題,因此它們是跨領域的問題。

第七, AOP 有哪些實現方式?

實現 AOP 的技術,主要分爲兩大類:

  • 靜態代理 - 指使用 AOP 框架提供的命令進行編譯,從而在編譯階段就可生成 AOP 代理類,因此也稱爲編譯時增強;
    編譯時編織(特殊編譯器實現)
    類加載時編織(特殊的類加載器實現)。

  • 動態代理 - 在運行時在內存中“臨時”生成 AOP 動態代理類,因此也被稱爲運行時增強。
    JDK 動態代理
    CGLIB

第八 ,Spring AOP and AspectJ AOP 有什麼區別?

Spring AOP 基於動態代理方式實現;AspectJ 基於靜態代理方式實現。
Spring AOP 僅支持方法級別的 PointCut;提供了完全的 AOP 支持,它還支持屬性級別的 PointCut。

第九,如何理解 Spring 中的代理?

將 Advice 應用於目標對象後創建的對象稱爲代理。在客戶端對象的情況下,目標對象和代理對象是相同的。

Advice + Target Object = Proxy

最後,什麼是編織(Weaving)?

爲了創建一個 advice 對象而鏈接一個 aspect 和其它應用類型或對象,稱爲編織(Weaving)。在 Spring AOP 中,編織在運行時執行。請參考下圖:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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