概述
面向方面的程式設計(AOP)是一個激動人心的新規範,和已經有十幾年歷史的物件導向的程式設計(OOP)在軟體開發上有相同的作用。 AOP和OOP不是相互競爭的技術,實際上它們相輔相成的十分融洽。物件導向的程式設計對於建模常見的對象等級體系非常有用。 它的不足之處在於處理跨多個非關聯物件模型的常見情況;這時就有AOP的用武之地了。AOP允許你跨關聯,使用單獨的、彼此之間非常不同的物件模型。 它允許你層次化--而不是嵌入--函數,以便代碼更易讀、更便於維護。 我們喜歡把物件導向的程式設計想象成為自頂向下的軟體開發,而面向方面的程式設計則是自左向右;它們是完全正交的技術,彼此之間相輔相成的十分融洽。
物件導向的程式設計的手段是繼承、封裝和多態性,而面向方面的程式設計的組件是通知/監聽器(advice/interceptor)、引入(introduction)、中繼資料(metadata)和切入點(pointcut) 。 讓我們看看這些定義。
通知/監聽器(advice/interceptor)
一個通知是被某一事件觸發的程式邏輯。 它是可以被插入一個方法調用者和實際的方法之間的行為。 通知實際上是面向方面的程式設計的關鍵。這些構造允許你定義橫切(cross-cutting)行為。通知允許你透明地應用象記錄和度量這樣的事到現有的物件模型中。
在JBoss AOP中,我們使用監聽器實現通知。你可以定義監聽器監聽方法調用、構造器調用和欄位訪問。稍後,我們將研究如何應用這些監聽器到一個現有的物件模型中。
引入
引入是一種添加方法或者欄位到一個現有類的方法。它們甚至允許你改變一個現有類目前實現的介面並且引入一個混合類實現這些新介面。
引入允許你把多繼承帶到簡單的Java類中。引入的一個重要的使用執行個體就是你有一個想有已耗用時間介面的方面。你想跨不同的對象層次應用你的方面,但是你仍然想應用程式開發人員能夠調用指定方面API。
Apple apple = new Apple();
LoggingAPI logging = (LoggingAPI)apple;
Apple.setLoggingLevel(VERBOSE);
引入可以是一個把新API附加於一個現有物件模型的方法。
中繼資料
中繼資料是可以附屬於一個類的附加資訊,或者以靜態方式或者在已耗用時間。當你可以動態地把中繼資料附上到一個對象給定的執行個體中的時候,它將更加有效。當你正在編寫可用於任何對象的一般的方面的時候,中繼資料顯得特別重要,但是程式邏輯必須知道指定類的資訊。中繼資料被使用的一種很類似的情況是EJB規範。在EJB XML配置描述符中,你在一個每方法的基礎上定義事務屬性。應用程式伺服器知道何時何地開始、暫停或者委託一個事務,因為你已經定義Required、RequiresNew、Supports等方法。在你的EJB類和交易管理程式綁定的中繼資料裡,是bean的XML設定檔。
C#已經把中繼資料構建入語言中。XDoclet是另一個正在工作的很好的中繼資料的例子。如果你曾經用過XDoclet來產生EJB檔案和配置描述符,你肯定知道中繼資料強大的功能。Java Community Process(JCP)達成協議,中繼資料被添加進JDK 1.5 (見JSR175)。直到JSR 175真正成為一種規範,一個好的AOP架構才能提供一個機制,聲明在已耗用時間有效類級中繼資料。
切入點
如果監聽器,引入和中繼資料是面向方面的程式設計的特性,那麼切入點就是把這些特性聯絡起來的紐帶。切入點告訴面向方面的程式設計架構,哪個監聽器將和哪個類捆綁在一起,哪些中繼資料將用於哪些類,或者引入將被匯入到哪些類中。 切入點定義能夠用於你的應用程式的類的各種面向方面的程式設計特性。