面向切面編程(AOP)的理解

來源:互聯網
上載者:User

面向切面編程(AOP)的理解

   在傳統的編寫商務邏輯處理代碼時,我們通常會習慣性地做幾件事情:日誌記錄、事務控制及許可權控制等,然後才是編寫核心的商務邏輯處理代碼。當代碼編寫完成回頭再看時,不禁發現,揚揚洒洒上百行代碼中,真正用於核心商務邏輯處理才那麼幾行,6-4所示。方法複方法,類複類,就這樣子帶著無可奈何遺憾地度過了多少個春秋。這倒也罷,倘若到了項目的尾聲,突然決定在許可權控制上需要進行大的變動時,成千上萬個方法又得一一"登門拜訪",痛苦"雪上加霜"。

  如果能把圖6-4中眾多方法中的所有共有代碼全部抽取出來,放置到某個地方集中管理,然後在具體運行時,再由容器動態織入這些共有代碼的話,最起碼可以解決兩個問題:

  Java EE程式員在編寫具體的商務邏輯處理方法時,只需關心核心的商務邏輯處理,既提高了工作效率,又使代碼變更簡潔優雅。

  在日後的維護中由於商務邏輯代碼與共有代碼分開存放,而且共有代碼是集中存放的,因此使維護工作變得簡單輕鬆。

  面向切面編程AOP技術就是為解決這個問題而誕生的,切面就是橫切面,6-5所示,代表的是一個普遍存在的共有功能,例如,日誌切面、許可權切面及事務切面等。

  下面我們以使用者管理商務邏輯組件UserService的AOP實現過程(見圖6-6)為例,深度剖析一下AOP技術的實現原理。AOP技術是建立在Java語言的反射機制與動態代理機制之上的。商務邏輯組件在運行過程中,AOP容器會動態建立一個代理對象供使用者調用,該代理對象已經按Java EE程式員的意圖將切面成功切入到目標方法的連接點上,從而使切面的功能與商務邏輯的功能同時得以執行。從原理上講,調用者直接調用的其實是AOP容器動態產生的代理對象,再由代理對象調用目標對象完成原始的商務邏輯處理,而代理對象則已經將切面與商務邏輯方法進行了合成。

  現將圖6-6中涉及到的一些概念解釋如下。

  切面(Aspect):其實就是共有功能的實現。如日誌切面、許可權切面、事務切面等。在實際應用中通常是一個存放共有功能實現的普通Java類,之所以能被AOP容器識別成切面,是在配置中指定的。

  通知(Advice):是切面的具體實現。以目標方法為參照點,根據放置的地方不同,可分為前置通知(Before)、後置通知(AfterReturning)、異常通知(AfterThrowing)、最終通知(After)與環繞通知(Around)5種。在實際應用中通常是切面類中的一個方法,具體屬於哪類通知,同樣是在配置中指定的。

  連接點(Joinpoint):就是程式在運行過程中能夠插入切面的地點。例如,方法調用、異常拋出或欄位修改等,但Spring只支援方法級的連接點。

  切入點(Pointcut):用於定義通知應該切入到哪些連接點上。不同的通知通常需要切入到不同的連接點上,這種精準的匹配是由切入點的Regex來定義的。

  目標對象(Target):就是那些即將切入切面的對象,也就是那些被通知的對象。這些對象中已經只剩下乾乾淨淨的核心商務邏輯代碼了,所有的共有功能代碼等待AOP容器的切入。

  代理對象(Proxy):將通知應用到目標對象之後被動態建立的對象。可以簡單地理解為,代理對象的功能等於目標對象的核心商務邏輯功能加上共有功能。代理對象對於使用者而言是透明的,是程式運行過程中的產物。

  織入(Weaving):將切面應用到目標對象從而建立一個新的代理對象的過程。這個過程可以發生在編譯期、類裝載期及運行期,當然不同的發生點有著不同的前提條件。譬如發生在編譯期的話,就要求有一個支援這種AOP實現的特殊編譯器;發生在類裝載期,就要求有一個支援AOP實現的特殊類裝載器;只有發生在運行期,則可直接通過Java語言的反射機制與動態代理機制來動態實現。

  以下是補充:

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

  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架構必須允許開發人員指定切入點,例如,使用Regex。

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

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

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

  •編織(Weaving):組裝方面來建立一個被通知對象。這可以在編譯時間完成(例如使用AspectJ編譯器),也可以在運行時完成。Spring和其他純Java AOP架構一樣,在運行時完成織入。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.