• 沒有找到結果。

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

2.2 AOP/AspectJ技術介紹

在企業應用程式 (Enterprise Application) 中,除了必須的業務面功能需求之外,通常還 會有權限控管 (access control )、交易控制 (transaction) 與記錄檔 (log) 等非功能性的 需求。這類需求有一個共通的特點,就是在應用程式內的各個模組之中都會用到,改 一個程式碼就要到各模組修改,不容易集中維護。在軟體開發的文獻中,通常稱這類 需求為應用程式的橫跨性關注 (Crosscutting concerns) [11]。現今應用廣泛的物件導向 程式設計 (Object-oriented programming) 對這類問題無法提供有效的封裝與模組化支 援,使得實現此類需求的程式碼必須重複出現於各個功能模組中,與其他程式碼糾結 在一起;雖然物件導向程式設計可以將相同的程式碼放到同個類別 (class) 中開發維 護,但是使用的時候還是要手動呼叫該類別中的函數才行。舉例來說,下面的程式碼 摘錄自 Java SE 6 標準函式庫的 java.io.File (http://download.java.net/openjdk/jdk6/),呼 叫 Java 安全服務 (System.getSecurityManager()) 的相同程式碼(圖 2-2 紅色框線部份)總 共有 24 次:

圖 2-2 java.io.File

上述正是剖面導向程式設計 (Aspect Oriented Programming, AOP) [12] 試圖要解決的的 問題。剖面導向程式設計的目的是將橫跨性關注予以模組化,例如權限控管 (access control )、交易控制 (transaction) 與記錄檔 (log) 這些遍佈應用系統,但是和系統核心 需求較不相關的功能。在剖面導向程式設計 (AOP) 中,一個程式包含了許多功能模組 (基本程式) 和一些封裝橫跨性關注 (crosscutting concerns)的剖面 (Aspects)。一個剖面 (Aspect) 模組提供了三種規格,以便實現基本程式中的橫跨性關注。第一個是切入點 (pointcut),切入點會選擇一套在程式執行中明確定義的連接點 (join points),指定在哪 個位置橫切到其他模組。第二個是意見 (advice),是當切入點遇到任何連接點時會執行 的一段程式碼。第三個是類型之間的宣告 (inter-type declarations),定義在基本程式中 的靜態類別階層上操作的橫跨性關注。圖 2-3 顯示 AOP 如何在應用程式中整合不同 模組:

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

圖 2-3 以剖面導向程式設計整合企業應用程式中的不同模組 [13]

基本上,剖面導向程式設計中所謂的織入 (weaving) 就是根據剖面 (Aspects) 中定義 的規格,組合功能模組和剖面來產生完整的程式。這樣一來,當剖面 (Aspects) 中的 規格有修改的時候,織入 (weaving) 會讓功能模組也做出相對應的修改。

AspectJ [14] 是和 Java 程式語言整合良好的一個剖面導向擴充。AspctJ 利用功能強大 的連接點 (jointpoint) 模型提供了一個切入點 (pointcut) 語言。在 AspectJ 中常用的連 接點是方法 (method)、建構子 (constructor) 的執行以及存取欄位 (field) 等等。切入 點 (pointcut) 前後的資訊稱為 thisJointPoint,我們可以透過切入點 (pointcut) 將這些 資訊傳遞到意見 (advice) 中。意見 (advice) 是 AspectJ 中的一個匿名方法 (anonymous method),和切入點連結在一起,並標記下列三個關鍵字其中之一:before, after 或 around。顧名思義,before 表示在連接點(join points) 之前、after 是在連接點 (join points) 之後執行,around 比較特別,在 around advice 內,我們可以藉著呼叫內建的

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

proceed() 繼續執行該方法,或是乾脆不執行。在 AspectJ 中,織入 (weaving) 的工具 和 AspectJ 的編譯器 ajc 整合在一起,所以把剖面 (Aspects) 編譯成 bytecode 的時候 就一併執行織入 (weaving) [15]。

此外,AspectJ 的類型之間的宣告 (inter-type declarations) 允許程式設計師新增需要的 方法 (method) 和欄位 (field),並且把這些新增的方法和欄位跟現有程式連結起來,因 此不需要修改現有程式就可以擴充該程式的功能。AspectJ 也允許提供一個有抽象切入 點 (Abstract pointcuts) 和抽象方法的抽象剖面 (Abstract aspects) 讓子剖面 (sub-aspect) 繼承,然後在子剖面中撰寫實作的切入點 (pointcut) 和方法。這種可以建立泛用剖面 (generic aspect) 的功能對應用框架來說很重要。

相關文件