讀《J2EE Development without EJB》 筆記四

          Posted on 2006-01-11 21:55 JDeodar 閱讀(389) 評論(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使我們開始在領域模型的層面上分析和識別橫切關注點,就像分析和識別對象一樣。

          posts - 10, comments - 2, trackbacks - 0, articles - 0

          Copyright © JDeodar

          主站蜘蛛池模板: 徐汇区| 武功县| 广平县| 榆中县| 革吉县| 祁阳县| 黎川县| 昭通市| 瓦房店市| 泰兴市| 衡东县| 青海省| 车致| 都安| 宜川县| 祥云县| 上林县| 郴州市| 崇仁县| 镶黄旗| 深泽县| 专栏| 德钦县| 安远县| 德清县| 霍城县| 当阳市| 南城县| 横山县| 德安县| 屏东市| 祁门县| 若羌县| 广东省| 时尚| 凌海市| 乌苏市| 苏尼特右旗| 溧水县| 九江县| 蕉岭县|