AOP 面向切面編程

什麼是AOP?

AOP全稱Aspect Oriented Programming意爲面向切面編程,也叫做面向方法編程,是通過預編譯方式和運行期動態代理的方式實現不修改源代碼的情況下給程序動態統一添加功能的技術。

AOP技術利用一種稱爲“橫切”的技術,剖解開封裝對象的內部,將影響多個類的公共行爲封裝到一個可重用的模塊中,並將其命名爲Aspect切面。所謂的切面,簡單來說就是與業務無關,卻爲業務模塊所共同調用的邏輯,將其封裝起來便於減少系統的重複代碼,降低模塊的耦合度,有利用未來的可操作性和可維護性。

利用AOP可以對業務邏輯各個部分進行隔離,從而使業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高開發效率。

AOP的使用場景主要包括日誌記錄、性能統計、安全控制、事務處理、異常處理等。

例如:日誌功能,日誌代碼往往橫向散佈在所有對象層次中,而與之對應的對象的核心功能毫無關係。對於其他類型的代碼,如安全性、異常處理、透明的持續性等也都是如此,這種散佈在各處而且無關的代碼被稱爲橫切(cross-cutting)。在OOP設計中,它們會導致大量重複的代碼,不利用模塊的重用。

例如:銀行系統的取款流程和查詢餘額的流程中都有存在相同的驗證流程

AOP與OOP有什麼關係呢?

AOP和OOP是面向不同領域的兩種思想,OOP面向對象編程主要是針對業務處理過程中的實體的屬性和行爲的抽象與封裝,以獲得更加清晰高效地邏輯單元。AOP面向切面編程是針對業務處理過程中的切面進行提取,它所面對的是處理過程中某個步驟或階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果。

AOP可以說是OOP的補充和完善,OOP引入封裝、繼承、多態等概念建立了一種對象層次結構,用來模擬公共行爲的一個集合。當需要爲分散的對象引入公共行爲的時候,OOP顯得無能爲力,也就是說,OOP允許定義從上到下的關係,但並不適合定義從左到右的關係。

AOP的本質是什麼呢?

AOP是實現分散關注的編程方法,將關注封裝在切面中。如何分散關注呢?將需求功能從不相關的類中分離出來,同時使多個類共用一個行爲,一旦行爲發生變化,不必修改多個類,只修改行爲即可。

AOP將軟件系統劃分爲兩個部分:核心關注點、橫切關注點,業務處理的主要流程是核心關注點,與之關係不大的部分是橫切關注點。橫切關注點的特點是經常發生在覈心關注點的多個位置,而且它們功能基本相似。AOP的作用在於分離系統中的各個關注點,將核心關注點和橫切關注點分離開來。

把模塊作爲一批關注點來實現

AOP只是一個概念並沒有設定具體語言的實現,它能克服那些只有單繼承特性語言的缺點。

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

一類是採用動態代理技術利用截取消息的方式,對消息進行裝飾以取代原有對象行爲的執行。

另一類是採用靜態織入的方式,引入特定語法創建切面,從而使編譯器可以在編譯期間織入相關的切面代碼。

AOP運行原理是什麼樣的呢?

AOP運行原理

AOP體系結構

AOP核心概念有哪些呢?

  • 橫切關注點

對哪些方法進行攔截,攔截後怎樣處理。

  • Aspect 切面

切面是散落在系統各處通用的業務邏輯代碼,如日誌模塊、權限模塊、事務模塊等。

切面用來裝載切入點PointCut和通知Advice

切面通常是一個類,可以定義切入點和通知。類是對物體特徵的抽象,切面是對橫切關注點的抽象。

切面是業務流程運行的某個特定步驟,是應用運行過程中的關注點,關注點通常會橫切多個對象,因此也被稱爲橫切關注點。

  • JointPoint 連接點

連接點是程序執行過程中明確的點,一般是類中方法的調用。連接點是程序在運行過程中能夠插入切面的地點,比如方法調用、異常拋出、字段修改等。

連接點

  • Advice 通知

通知是AOP在特定切入點上執行的增強處理,是攔截到連接點之後要執行的代碼,通知可以分爲前置通知Before、後置通知AfterReturning、異常通知AfterThrowing、最終通知After、環繞通知Around五類。

  • PointCut 切入點

切入點是帶有通知的連接點,在程序中主要體現爲編寫切入點表達式。切入點是對連接點進行攔截的定義。切入點用於定義通知應該切入到哪些連接點上,不同的通知需要切入到不同的連接點上,這種精準的匹配是由切入點的正則表達式來定義的。

切入點是可以插入增強處理的連接點,當某個連接點滿足執行要求時,該連接點將被連接增強處理,該連接點也就變成了切入點。

切入點是攔截的方法,連接點JointPoint攔截後將變成切入點。

  • Proxy 代理對象

代理對象是AOP創建的對象,包含通知,代理是目標對象的加強。 代理是將通知應用到目標對象之後被動態創建的對象,可以簡單理解代理對象的功能等同於目標對象的核心業務邏輯功能加上共有功能。代理對象對於使用者而言是透明的,是程序運行過程中的產物。

  • Weaving 織入

通過切入點切入,將切面應用到目標對象並導致代理對象創建的過程。將切面應用到目標對象從而創建一個新的代理對象的過程,這個過程可以發生在編譯期、類轉載期、運行期,不同的發生點有着不同的前提條件。如果發生在編譯器就需要有一個支持這種AOP實現的特殊編譯器,發生在類轉載期就需要有一個支持AOP實現的特殊類轉載期,發生在運行期則可以直接通過反射機制與動態代理機制來動態實現。

  • Target 目標對象

目標對象是指代理的目標對象,是指要織入的對象模塊。目標對象是那些即將切入切面的對象,也就是被通知的對象。這些對象中已經只剩下乾乾淨淨的核心業務邏輯代碼,所有的共有功能等待AOP容器的切入。

目標對象是AOP進行增強處理的對象,也被稱爲增強的對象。如果AOP是通過運行時代理來實現的,那麼這個對象將是一個被代理的對象。

AOP是典型的代理模式的體現,代理模式的特徵是代理類與委託類有同樣的接口,代理類主要負責爲委託類預處理消息、過濾消息、將消息轉發給委託類、事後處理消息等。代理類與委託類之間通常會存在關聯關係,一個代理類的對象與一個委託類的對象相關聯,代理類的對象本身並不真正實現服務,而是通過調用委託類的對象方法來提供特定的服務。

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