簡析面向切面編程AOP

  AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。這裡不得不提一下面向對象編程(OOP)。AOP與OOP是面向不同領域的兩種設計思想。

  OOP(面向對象編程)針對業務處理過程的實體及其屬性和行為進行抽象封裝,以獲得更加清晰高效的邏輯單元劃分。

  AOP則是針對業務處理過程中的切面進行提取,它所面對的是處理過程中的某個步驟或階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果。

  我們可以單單從上面的字面上來理解AOP和OOP的話,用下面的理解也不為過:

  OOP實際上是對對象的屬性和行為的封裝,而AOP對於這點就無從談起,但是AOP是處理某個步驟和階段的,從中進行切面的提取,也就是說,如果幾個或更多個邏輯過程中,有重複的操作行為,AOP就可以提取出來,運用動態代理,實現程序功能的統一維護,這麼說來可能太含蓄,如果說到許可權判斷,日誌記錄等,可能就明白了。如果我們單純使用OOP,那麼許可權判斷怎麼辦?在每個操作前都加入許可權判斷?日誌記錄怎麼辦?在每個方法里的開始、結束、異常的地方手動添加日誌?所有,如果使用AOP就可以藉助代理完成這些重複的操作,就能夠在邏輯過程中,降低各部分之間的耦合了。二者揚長補短,互相結合最好。

下面詳細了解一些AOP的概念:

方面(Aspect):一個關注點的模塊化,這個關注點實現可能另外橫切多個對象。事務管理是J2EE應用中一個很好的橫切關注點例子。方面用Spring的Advisor或攔截器實現。

連接點(Joinpoint):程序執行過程中明確的點,如方法的調用或特定的異常被拋出。

通知(Advice):在特定的連接點,AOP框架執行的動作。各種類型的通知包括「around」、「before」和「throws」通知。通知類型將在下面討論。許多AOP框架包括Spring都是以攔截器做通知模型,維護一個「圍繞」連接點的攔截器鏈。

切入點(Pointcut):指定一個通知將被引發的一系列連接點的集合。AOP框架必須允許開發者指定切入點,例如,使用正則表達式。

引入(Introduction):添加方法或欄位到被通知的類。Spring允許引入新的介面到任何被通知的對象。例如,你可以使用一個引入使任何對象實現IsModified介面,來簡化緩存。

目標對象(Target Object):包含連接點的對象,也被稱作被通知或被代理對象。

AOP代理(AOP Proxy):AOP框架創建的對象,包含通知。在Spring中,AOP代理可以是JDK動態代理或CGLIB代理。

編織(Weaving):組裝方面來創建一個被通知對象。這可以在編譯時完成(例如使用AspectJ編譯器),也可以在運行時完成。Spring和其他純Java AOP框架一樣,在運行時完成織入。Spring 中 AOP 代理由 Spring 的 IoC 容器負責生成、管理,其依賴關係也由 IoC 容器負責管理。

推薦閱讀:

小議webpack下的AOP式無侵入注入
Spring AOP中定義切點(PointCut)和通知(Advice)
C++實現簡單的攔截器

TAG:AOP | 面向對象編程 |