1. 程式人生 > >面向切面編程(AOP)的理解

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

bottom 實現原理 cell strong ora max images 處理 style

AOP是什麽(Aspect Oriented Programming)

  • AOP是一種編程範式,提供從還有一個角度來考慮程序結構以完好面向對象編程(OOP)。

  • AOP為開發人員提供了一種描寫敘述橫切關註點的機制,並可以自己主動將橫切關註點織入到面向對象的軟件系統中。從而實現了橫切關註點的模塊化。
  • AOP可以將那些與業務無關,卻為業務模塊所共同調用的邏輯或責任。比如事務處理、日誌管理、權限控制等。封裝起來,便於降低系統的反復代碼,降低模塊間的耦合度,並有利於未來的可操作性和可維護性。
AOP能幹什麽,也是AOP帶來的優點
  • 減少模塊的耦合度
  • 使系統easy擴展
  • 設計決定的遲綁定:使用AOP,設計師能夠推遲為將來的需求作決定,由於它
  • 能夠把這樣的需求作為獨立的方面非常easy的實現。
  • 更好的代碼復用性

在傳統的編寫業務邏輯處理代碼時,我們一般會習慣性地做幾件事情:日誌記錄、事務控制及權限控制等,然後才是編寫核心的業務邏輯處理代碼。當代碼編寫完畢回頭再看時,不禁發現。揚揚灑灑上百行代碼中。真正用於核心業務邏輯處理才那麽幾行。如圖6-4所看到的。

方法復方法。類復類,就這樣子帶著無可奈何遺憾地度過了多少個春秋。這倒也罷。倘若到了項目的尾聲,突然決定在權限控制上須要進行大的變動時。成千上萬個方法又得一一"登門拜訪",痛苦"雪上加霜"。

技術分享

假設能把圖6-4中眾多方法中的所有共同擁有代碼所有抽取出來,放置到某個地方集中管理。然後在詳細執行時,再由容器動態織入這些共同擁有代碼的話,最起碼能夠解決兩個問題:

Java EE程序猿在編寫詳細的業務邏輯處理方法時,僅僅需關心核心的業務邏輯處理,既提高了工作效率。又使代碼變更簡潔優雅。

在日後的維護中因為業務邏輯代碼與共同擁有代碼分開存放。並且共同擁有代碼是集中存放的,因此使維護工作變得簡單輕松。

面向切面編程AOP技術就是為解決問題而誕生的。切面就是橫切面,如圖6-5所看到的,代表的是一個普遍存在的共同擁有功能,比如。日誌切面、權限切面及事務切面等。

技術分享

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

技術分享

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

切面(Aspect):由切點和增強組成,既包含了橫切邏輯的定義。也包含了連接點的定義。

通知(Advice):是切面的詳細實現。

以目標方法為參照點,依據放置的地方不同,可分為前置通知(Before)後置返回通知(AfterReturning)後置異常通知(AfterThrowing)後置終於通知(After)圍繞通知(Around)5種。在實際應用中一般是切面類中的一個方法。詳細屬於哪類通知。相同是在配置中指定的。

連接點(Joinpoint):程序運行的某個特定的位置。比方類初始化前,初始化後。方法調用前。方法調用後等等

切入點(Pointcut):用於定義通知應該切入到哪些連接點上。

不同的通知通常須要切入到不同的連接點上,這樣的精準的匹配是由切入點的正則表達式來定義的。

目標對象(Target):增強邏輯的織入目標類。

代理對象(Proxy):將通知應用到目標對象之後被動態創建的對象。

能夠簡單地理解為,代理對象的功能等於目標對象的核心業務邏輯功能加上共同擁有功能。代理對象對於使用者而言是透明的。是程序執行過程中的產物。

織入(Weaving):將切面應用到目標對象從而創建一個新的代理對象的過程。

這個過程能夠發生在編譯期、類裝載期及執行期,當然不同的發生點有著不同的前提條件。

譬如發生在編譯期的話。就要求有一個支持這樣的AOP實現的特殊編譯器;發生在類裝載期,就要求有一個支持AOP實現的特殊類裝載器;僅僅有發生在執行期,則可直接通過Java語言的反射機制與動態代理機制來動態實現。

增強:織入到目標類連接點上的一段代碼


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