當前位置:
首頁 > 最新 > Spring核心之AOP

Spring核心之AOP

個人整理和分享

如果覺得不錯的話

歡迎關注

既上次介紹了IOC之後,這次再整理下Spring的另外一個核心內容——面向切面編程(Aspect-Oriented Programming ,即AOP) 。

AOP是什麼?我們先看下官方的定義:

Aspect-Oriented Programming(AOP) complements Object-Oriented Programming (OOP) by providing another way of thinking about program structure. The key unit of modularity in OOP is the class, whereas in AOP the unit of modularity is theaspect. Aspects enable the modularization of concerns such as transaction management that cut across multiple types and objects. (Such concerns are often termedcrosscuttingconcerns in AOP literature.)

翻譯:面向切面編程(AOP)可以通過類比面向對象編程(OOP)來理解。在OOP中模塊化的核心單位是類;而在AOP中,核心的單位是切面。切面使事務管理等關注點的模塊化得以實現,比如跨多個類型和對象的事務管理。

在定義中,有提到切面這個概念,到底什麼事切面呢?除了切面外,我們還需要了解幾個相關的概念:

切面(Aspect)Spring中的切面是通過類實現的,切面是一個或跨域多個類的關注點的模塊化,是一個抽象;事務管理是企業Java應用程序中使用切面的一個很好的例子。

連接點(Join Point)在執行程序時的一個點,例如一個方法的執行或者一個異常的處理。

切點(Point Cut)切點會匹配通知所要織入的一個或者多個連接點。

通知(Advice)在特定連接點的切面上的響應。

目標對象(Target Object)由一個或多個切面提供通知的對象。也稱為通知對象。由於Spring AOP是使用運行時代理實現的,所以這個對象將永遠是一個代理對象。

織入(Weaving)將切面與其他應用程序類型或對象連接起來以創建新的代理對象的過程。這可以在編譯時完成(例如,使用AspectJ編譯器)、載入時間或運行時。與其他純Java AOP框架一樣,Spring AOP在運行時執行織入。

通知的類別:

前置通知(before):在目標方法被調用之前調用通知功能。

後置通知(after):在目標方法完成之後調用通知,此時不會關心方法的輸出是什麼。

返回通知(after-returning):在目標方法成功執行之後調用通知。

異常通知(after-throwing):在目標方法拋出異常之後調用通知。

環繞通知(around):通知包裹了被通知的方法,在被通知的方法調用之前和調用之後執行自定義的行為。

看完上面這些內容,想必大家已經對AOP有個基本的認識了。

那麼,AOP有什麼用?

前面已經提到了,主要應用於企業Java應用程序中的事務管理,例如,登錄校驗,方法執行的許可權校驗等各種場景。

如何實現事務模塊化的管理?

我們可以定義按模塊來定義切面,例如對應模塊的controller作為一個切面,也可以統一管理多個類中的方法,給定特定的前綴等;然後再結合其他來進行切面管理。

如何使用Spring的AOP?

這裡只介紹比較常用的兩種,完全通過XML配置的方式與通過XML簡單配置與註解結合的方式。還有可以啟用AspectJ的方式,這裡不作介紹,有興趣的可以自行了解下。

使用AOP,包括定義切面、切點、通知和連接點以及將它們聯繫起來。

完全通過XML配置:

通過XML簡單配置與註解結合:

使用註解的方式還需要做的一部就是,在Spring的配置文件中,加入這段話(當然,配置文件中還要引入命名空間):

沒接觸過的朋友一下子有點蒙,它們關係如何理解,切點表達式怎麼寫;這兩點再細講一下:

切面、切點和通知的關係:

切點表達式:

本期對AOP的介紹暫時先寫這麼多,以後可能會整理下從源碼的角度來理解AOP的內部原理,希望對AOP還不太了解的同鞋有所幫助。

如果有什麼建議或意見,歡迎反饋,謝謝!

都看到這裡了

點個關注唄

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 LearnToCode 的精彩文章:

TAG:LearnToCode |