面向方面編程慨述和JBoss
概述
面向方面的程序設計(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框架才能提供一個機制,聲明在運行時間有效的類級元數據。
切入點
如果監聽器,引入和元數據是面向方面的程序設計的特性,那么切入點就是把這些特性聯系起來的紐帶。切入點告訴面向方面的程序設計框架,哪個監聽器將和哪個類捆綁在一起,哪些元數據將用于哪些類,或者引入將被導入到哪些類中。 切入點定義能夠用于你的應用程序的類的各種面向方面的程序設計特性。
工作中的面向方面的程序設計