Posted on 2006-01-11 21:55
JDeodar 閱讀(385)
評論(0) 編輯 收藏 所屬分類:
J2EE
Declarative Middleware Using AOP Concepts -- 基于AOP概念的聲明性中間件
AOP的全稱是面向方面編程(Aspect-Oriented Programming),這是Gregor Kiczales于1996年在PARC提出的一個術語。AOP是一種與OOP截然不同的看待應用程序結構的方式,按照AOP的觀念,系統被分解為方面(aspect)或者關注點(concern),而不是對象。
曾經有一位同行把他理解為面向切面編程,更具有幾何學的味道,也很容易理解。
AOP的目標是將橫切性(crosscutting)的問題以一種更加通用的方式模塊化,從而提升程序的模塊化程度。
AOP應該看作是OOP的補充,而不是競爭對手、替代者,AOP不僅可以減少重復代碼的麻煩,而且為系統的領域模型的設計上帶來一種更加完善的理念。
幾個關于AOP術語定義:
1、關注點(concern):一個關注點可以是一個特定的問題、概念、或是應用程序的興趣區間--總而言之,應用程序必須達到的一個目標。
2、橫切關注點(crosscutting concern):如果一個關注點的實現代碼散落在很多個類或方法之中,就稱之為“橫切關注點”。
3、方面(aspect):一個方面是對一個橫切關注點的模塊化,它將那些原本散落在各處的、用于實現這個關注點的代碼規整到一處。
4、連接點(join point):程序執行過程中的一點,例如:
方法調用(method invocation):對方法(可能包括構造子)的調用。
字段訪問(field access):讀或寫實例變量。
異常拋出(throws):特定的異常被拋出。
5、增強(advice):在特定連接點執行的動作。--很多AOP框架都以攔截器(interceptor)的形式來表現增強---所謂攔截器是這樣的一個對象:當連接點被調用到時,它會收到一個回調信息。
6、切入點(pointcut):一組連接點的總稱,用于指定某個增強應該在何時被調用。切入點常用正則表達式或別的通配符語法來描述。
7、引介(introduction):為一個現有的Java類或接口添加方法或字段。
8、混入繼承(mixin inheritance):一個“混入類”封裝了一組功能,這組功能可以被“混入”到現有的類當中,并且無須求助于傳統的繼承手段。
9、織入(weaving):將方面整合到完整的執行流程(或完整的類,此時被植入的便是引介)中。
10、前增強(before,pre):在連接點調用之前,首先調用增強。
11、后增強(after,post):在連接點調用之后,再調用增強。
12、環繞增強(around):這類增強可以完全控制執行流程。
13、攔截器(interceptor):一種AOP的實現策略。
14、AOP代理(AOP proxy):即被增強(advice)的對象引用---也就是說,AOP增強將在其上執行的這樣一個對象引用。
15、目標對象(target object)]
16、增強器(advisor)Spring引入的概念,由兩個部分組成:一個增強,以及一個用于說明“在何處進行增強”的切入點。增強器完整地模塊化了一個方面。這樣,切入點和增強也可以各自獨立地復用。
Decorator模式,需要針對每個目標類單獨編寫一個定制的裝飾器。
Observer模式,必須插入一些與業務邏輯無關的代碼。
Chain of Responsibility(責任鏈)模式,允許將一個請求在一條對象鏈上傳播,直到其中的某一個對象負責處理請求為止。
Servlet2.3規范引入的servlet攔截器會在處理web請求的前后被調用。
AOP技術的主要策略:J2SE動態代理、動態字節碼生成、Java代碼生成、使用定制的類加載器、語言擴展。
動態代理(dynamic proxies),是一種強大的語言結構。
動態代理最大的好處在于:這是一種標準的Java語言特性。除了AOP框架之外不需要第三方庫,也不會受到應用服務器的任何影響。
動態代理的最大局限性在于:它只能針對接口進行代理,不能針對類。不是壞事--因為AOP主要針對業務對象,而業務對象通常應該是放在業務接口之后的。
動態字節碼生成(dynamic byte code generation),為了針對Java類提供代理,我們需要動態代理之外的工具,那就是動態字節碼生成。Java的反射和類裝載機制都非常開放。--最流行的工具CGLIB(Code Generation Library)。CGLIB是通過繼承來實現代理的,所以無法為final方法提供代理。
Java代碼生成,由于前兩者的出現,其正在退出流行。
使用定制的類加載器--?
語言擴展
AOP實現:AspectJ、AspectWerkz、JBoss4、Spring
AspectJ可以對任何方法調用、字段訪問、對象構造、異常拋出進行增強。
AspectWerkz和AspectJ已合并。
JBoss4的AOP框架和JBoss應用服務器的邦定,損害了J2EE“可移植性”的優點。
AOP在J2EE應用中的價值大多體現在方法攔截上--過幾年,還會是這樣么?
通常AOP用于業務對象提供增強,在這種情況下,攔截的性能開銷根本不成問題。關鍵:什么粒度夏使用AOP。
一次涉及凡是的方法調用需要耗費的時間是毫秒級的--在服務器環境下通常在幾毫秒至十幾毫秒的范圍。從比較來看,一次數據庫只讀訪問的時間開銷通常是數十毫秒,通過瀏覽器訪問web頁面的網絡延遲則是百毫秒級的。也就是說,對于一個由遠程客戶端發起、需要涉及一到兩次數據庫訪問的業務操作來說,“通過反射調用業務方法”的時間開銷完全可以忽略不計。
AOP最有價值的用途就是在業務方法的粒度上提供通用的企業級服務,譬如聲明性事物管理和聲明性安全檢查等。
AOP和IoC之間有特別緊密地合作關系。
Spring中的AOP實踐
1、使用ProxyFactoryBean:創建AOP代理的基本途徑。
2、便利的FactoryBean:例如TransactionProxyFactoryBean(聲明性的事物管理)。
3、自動代理
AOP使我們開始在領域模型的層面上分析和識別橫切關注點,就像分析和識別對象一樣。