面向切面編程入門(一)

 主要內容:

    1.面向切面編程(AOP)概念

    2.面向切面編程(AOP)與面向對象編程(OOP)的區別

    3.面向切面編程(AOP)的優缺點

    4.有關面向切面編程(AOP)的幾個重要概念

    5.AOP和OOP是什麽關係

一、面向切面編程(AOP)概念

    面向切面編程(Aspect-Oriented Programming,英文簡稱AOP),它是可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種技術。它是一種新的方法論,它是對傳統OOP編程一種補充。

   主要的功能是:日誌記錄,性能統計,安全控制,事務處理,異常處理等等。

   主要的意圖是:將日誌記錄,性能統計,安全控制,事務處理,異常等代碼從業務邏輯代碼中劃分出來通過這些行為的分享,我們希望可以將它們獨立到非業務邏輯的方法中,進而改變這些行為的時候不影響業務邏輯的代碼。

二、面向切面編程(AOP)與面向對象編程(OOP)的區別

   OOP是關注將需求功能劃分為不同的並且相對獨立,封裝良好的類,并讓它們有著屬於自己的行為,依靠繼承和多態等來定義彼此的關係;AOP是希望能名夠將通用需求功能從不相關的類當中分離出來,能夠使得很多類共享一個行為,一旦發生變化,不必修改很多類,而只需要修改這個行為即可。

   AOP是使用切面(aspect)將橫切關注點模塊化,OOP是使用類將狀態和行為模塊化。在OOP的世界中,程序都是通過類和接口組織的,使用它們實現程序的核心業務邏輯是十分合適。但是對于實現橫切關注點(跨越應用程序多個模塊的功能需求)則十分吃力,比如日誌記錄,驗證。

三、面向切面編程(AOP)優缺點

     缺點:過于複雜;破壞封裝;

     優點:

       (一) AOP將諸如事務管理等本來橫向分佈在多個對象中的關注點進行了模塊化處理。

      (二)在定義應用程序對某種服務(例如日誌)的所有需求的時候。通過識別關注點,使得該服務能夠被更好的定義,更好的被編寫代碼,并獲得更多的功能。這種方式還能夠處理在代碼涉及到多個功能的時候所出現的問題,例如改變某一個功能可能會影響到其它的功能,在AOP把這樣的麻煩稱之為“糾結(tangling)”

      (三) 利用AOP技術對離散的方面進行的分析將有肋于為開發團隊指定一位精于該項工作的專家。負責這項工作的最佳人選將可有效利用自己的相關技能和經驗。

     (四)持久性。標準的面向對象的項目開發中,不同的開發人員通常會為某項服務編寫相同的代碼,例如日誌記錄。隨後他們會在自己的實施中分別對日誌進行處理以滿足不同單個對象的需求。而通過創建一段單獨的代碼片段,AOP提供了解決這一問題的持久簡單的方案,這一方案強調了未來功能的重用和易維護性:不需要在整個應用中一遍遍重新寫日誌代碼,AOP使用僅僅編寫日誌方面(logging aspect)成為可能,並且可以在這之上為整個應用程序提供新功能。

四、有關面向切面編程(AOP)幾個重要概念

    第一個:切面(Aspect),這個中文的翻譯,你可以把它翻譯成方面,一部份...關于它的翻譯太多,我們不關注這些,我們知道理解它是核心功能就OK了。切面簡單的理解就是把那些不是核心業務應該處理的代碼提取出來,進行封裝成模塊化。來處理那些附加的功能代碼。(日誌,事務,安全驗證)我們把這個模塊的作用理解為一個切面,告訴我們它是一個功能模塊,我們可以把它看成一個切面,說白了就是我們寫一個類,在這個類中寫一些處理在核心業務中起到同樣效果的方法。

   第二個:連接點(Joinpoint),簡單的理解就是在切面模塊中定義的方法,就是上定義類中的方法

   第三個:切入點(Pointcut),就是連接點的集合,就是一組方法的集合了

   第四個:通知(Advice),簡單的理解就是告訴一個方法什麽時間觸發執行。把它卸任一個條件判斷,判斷這個方法何時執行。

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

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

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

五、AOP和OOP是什麽關係

  很多人在初次接觸AOP的時候可能會說,AOP能做到的,一個定義良好的OOP的接口也一樣能夠做到,我想這個觀點是值得商榷的。AOP和定義良好的OOP的接口可以說都是用來解決並且實現需求中橫切問題的方法。但是對于OOP中的接口來說,它仍然需要我們在相應的模塊中去調用該接口中相關的方法,這是OOP所無法避免的,並且一旦接口不得不進行修改的時候,所有事情會變得一團遭;AOP則不會這樣,你只需要修改相應的Aspect,再重新紡織即可。當然,AOP也絕對不會代替OOP。核心的需求仍然會由OOP來加以實現,而AOP將會和OOP整合起來,以此之長,補彼之短。

  六 小結

          總而言之,AOP技術的優勢使得需要編寫的代碼量大大縮減,節省了時間,控制了開發成本。同時也使得開發人員可以集中關注于系統的核心商業邏輯。此外它更得更籃球創建鬆散耦合、可複用與可擴展的大型軟體系統。

原文地址:https://www.cnblogs.com/xiaowuzi/p/3453680.html