AOP學習(一)

          說明:本文大部分來自Spring in action。
          1、概述   
           SpringIoC容器能管理和配置應用系統對象,因此我們可以遵行完美的面向隊象設計,編寫松耦合的代碼,利用Spring的反向控制無痛連接協作類。但有時某些功能會在整個系統中到處用到,這就不是很適合對象繼承關系來解決。這就是面向切面(AOP)的切入點。
              Spring的AOP框架將分散在系統中的功能塊放在一個地方——切面。依賴Spring的強大的切入點機制,何時何地在系統中采用切面有很多種選擇。           
              使用AOP,可以在一個地方定義通用功能,可以定義何時何地應用這些功能,而不用在需要新功能的地方修改代碼。交叉業務(AOP實際上指的是交叉業務模塊化)可以模塊化到特定的對象切面中。這樣做有兩個好處。第一,現在每個業務邏輯放在一個地方,而不是分散到代碼的各個角落。第二,我們的服務模塊更加清晰,因為他們只包含他們的核心功能,輔助功能轉移到切面中。 
              AOP從程序運行的角度考慮程序的結構,提取業務處理過程的切面。
          AOP面對程序運行中各個步驟,以期待降低各步驟之間的耦合,從而提高步驟之間的隔離。
              OOP是靜態的抽象,它對應用中的實體及其屬性、行為進行抽象,從而獲得清晰高效的單元劃分;而AOP是動態的抽象,它對應用執行的過程的步驟進行抽象,從而獲得步驟之間的邏輯劃分。AOP框架并不與特定的代碼耦合,能處理程序執行中的特定的點,而不是某個具體的程序。

          2、術語
          切面(Aspect)
              切面是你要實現的交叉功能。它是應用系統模塊化的一個切面或領域。切面的最常見(雖然簡單)的例子是日志記錄。日志記錄在系統中到處用到,利用繼承來重用日志模塊不合適。然而,你可以創建一個日志記錄切面,并且使用AOP在系統中應用。
          連接點(Joinpoint)
              連接點是應用程序執行過程中插入的切面的地點。這個地點可以是方法調用,異常拋出,或者甚至是要修改的字段。切面代碼在這些地方插入到你的應用系統中,添加新的行為。
          通知(Advice)
              切面的實際實現。它通知應用系統新的行為。在日志的例子中,日志通知包含了實現實際日志功能的代碼,如向日志文件寫日志。通知在連接點插入到應用系統中。
          切入點(Pointcut)
              切入點定義了通知應該應用在哪些連接點。通知可以應用到AOP框架支持的任何連接點。當然,你并不希望把所有的切面應用到所有可能的連接點上。切入點讓你指定通知應用到什么地方。通常通過指定類名和方法名,或者匹配類名和方法名式樣的正則表達式來指定切入點。一些AOP框架允許動態創建切入點,在運行時根據條件決定是否應用切面,如方法參數等。
          引入(Introduction)
              引入允許你為已存在類添加新方法和屬性(哈,是種幻覺?)。例如,你可以創建一個稽查通知來記錄對象的最后修改時間。只要用一個方法setLastModified(Date)以及一個保存這個狀態的變量。可以在不改變已存在類的情況下將這個引入,給他們新的行為和狀態。
          目標對象(Target)
              目標對象是被通知對象,它可以是你編寫的類,也可以是你定制行為的第三方類。如果沒有AOP,這個類就必須要包含它的主要邏輯以及交叉業務邏輯。有了AOP,目標對象就可以全身心地關注主要業務,忘記應用其上的通知。
          代理(Proxy)
              代理是將通知應用到目標對象后創建的對象。對于客戶對象來說,目標對象(應用AOP之前的對象)和代理對象(應用AOP之后的對象)是一樣的。也就是說,應用系統的其他部分不用為了支持代理對象而改變。
          織入(Weaving)
              織入是將切面應用到目標對象從而創建一個新的代理對象的過程。切面在指定接入點被織入到目標對象中,織入發生在目標對象生命周期的多個點上:
                  編譯器——切面在目標對象編譯時織入。這需要一個特殊的編譯器
                  類裝載期——切面在目標對象被載入到JVM中時織入。這需要一個特殊的類裝入器,它在類載入到應用系統之前增強目標對象的字解碼。
                  運行期——切面在應用系統運行時織入。通常,AOP容器將織入切面的時候動態生成委托目標對象的代理對象。

          3、Spring的AOP實現
              不是所有的AOP框架都按同樣的方式實現。他們在能夠提供的接入點種類上有所不同。有些允許你在字段修改級別上應用通知,而有些只能在方法調用上暴露連接點。他們在何時如何織入切面上也有所不同。無論什么情況,能夠創建連接點,定義切面在哪些連接點織入是AOP框架的關鍵。
          用Java編寫Spring的通知
              在Spring中所有的通知都以Java類的形式編寫。這意味著你可以像普通Java開發那樣在集成環境中開發切面。定義在什么地方應用通用的切入點通常編寫在Spring的配置文件中。
          Spring的運行時通知對象
              代理Bean只有在第一次被應用系統需要的時候才被創建。如果你使用的是ApplicationContext,代理對象在BeanFactory載入所有Bean的時候被創建。因為Spring在運行期創建代理,所有使用Spring AOP不需要特殊編譯器 。
              Spring有兩種代理創建方式。如果目標對象實現了一個(或多個)接口暴露的方法,Spring將使用JDK的java.lang.reflect.Proxy類創建代理。這個類讓Spring動態產生一個新的類,它實現了所需的接口,織入了通知,并且代理對目標對象的所有請求。
              如果目標對象沒有實現任何接口,Spring使用CGLIB庫庫生成目標對象的子類。在創建這個子類的時候,Spring將通知織入,并且對目標對象的調用委托給這個子類。當使用這種代理生成方式時,需要將Spring發型包中的lib/cglib目錄下的JAR文件發布到應用系統中。在使用這種代理生成方式時,需要注意兩個要點:
              對接口創建代理優于對類創建代理,因為這樣會產生更加松耦合的系統。對類創建代理是讓遺留系統或無法實現接口的第三方類庫同樣可以得到通知。這種方式應該是備用方式,而不是第一選擇。
              標記為final的方法不能被通知。記住,Spring是為目標類產生子類。任何需要被通知的方法都被復寫,將通知織入。final方法是不可能做到的。
          Spring只支持方法連接點
              這一點和一些其他AOP框架不一樣,如AspectJ和JBoss,他們還提供了屬性接入點,這樣可以防止你常見特別細致的通知,如對更新對象屬性值進行攔截。
              然而,由于Spring關注于提供一個實現J2EE服務的框架,所以方法攔截可以滿足大部分需求。加上Spring的觀點是屬性攔截破壞了封裝。面向對象的基本概念是對象自己處理工作,其他對象只能通過方法調用得到處理結果。讓通知觸發在屬性值改變而不是方法調用上無疑是破壞了這個概念。

          posted on 2008-03-25 11:21 肖麥 閱讀(439) 評論(0)  編輯  收藏 所屬分類: Spring


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          English

          JavaAPI

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 石景山区| 武夷山市| 祁阳县| 洞头县| 涿鹿县| 依安县| 宁河县| 图片| 辽中县| 木里| 紫云| 专栏| 兴城市| 沧源| 喀喇| 黔东| 余庆县| 济南市| 榆树市| 赤城县| 鹤岗市| 夏河县| 桑植县| 菏泽市| 社会| 前郭尔| 石首市| 赤峰市| 犍为县| 汉沽区| 涟源市| 裕民县| 金寨县| 汕尾市| 富平县| 阳曲县| 泉州市| 临邑县| 枣阳市| 新蔡县| 沙雅县|