面向切面程式設計的基本原理
通過pojo建立切面
使用@aspectj註解
為aspectj切面注入依賴
引言——在軟體開發中,散布於應用中多處的功能被稱為橫切關注點(cross-cutting concern),橫切關注點應該是與業務邏輯相分離的,實現這種分離就是面向切面程式設計(aop)要解決的問題。
切面的常用術語有通知(advice)、切點(pointcut)和連線點(joint point)。如圖所示:
切面的工作被稱為通知。通知定義了切面是什麼以及何時使用。spring切面可以應用5種型別的通知:
前置通知(before):在目標方法被呼叫之前呼叫通知功能;
後置通知(after):在目標方法完成之後呼叫再通知,此時不關心方法的輸出是什麼;
返回通知(after-returning):在目標方法成功執行之後呼叫通知;
異常通知(after-throwing):在目標方法丟擲異常後呼叫通知;
環繞通知(around):通知包裹了被通知的方法,在被通知的方法呼叫之前和呼叫之後執行自定義的行為。
連線點是在應用執行過程中能夠插入切面的乙個點,這個點可以是呼叫方法時、丟擲異常時、甚至修改乙個欄位時。切面**可以利用這些點插入到應用的正常流程之中,並新增新的行為。
乙個切面並不需要通知應用的所有連線點。切點有助於縮小切面所通知的連線點的範圍。
如果說通知定義了切面的「什麼」和「何時」的話,那麼切點就定義了何處
切面是通知和切點的結合。通知和切點共同定義了切面的全部內容——它是什麼,在何時和何處完成其功能
引入允許我們向現有的類新增新方法或屬性。
織入是把切面應用到目標物件並建立新的**物件的過程。在目標物件的生命週期裡有多個點可以進行織入:
編譯器:切面在目標類編譯時被織入。這種方式需要特殊的編譯器類載入期:切面在目標類載入到jvm時被織入。這種方式需要特殊的類載入器,它可以在目標類被引入應用之前增強該目標類的位元組碼。
執行期:切面在應用執行的某個時刻被織入。一般情況下,在織入切面時,aop容器會為目標物件動態地建立乙個**物件。
spring提供了4中型別的aop支援:
基於**的經典spring aop;
純pojo切面;
@aspectj註解驅動的切面;
注入式aspectj切面(適用於spring各版本)。
spring aop構建在動態**基礎之上,因此,spring對aop的支援侷限於方法攔截。
在基於xml的配置中,可以使用spring的aop命名空間將純pojo轉換為切面,這些pojo只是提供了滿足切點條件時所要呼叫的方法。
spring借鑑了aspectj的切面,以提供註解驅動的aop。這種aop風格的好處是能夠不使用xml來配置。
spring中的aop
spring在執行時通知物件。也就是說spring不會在編譯器或者類載入期完成織入。通過在**類中包裹切面,spring在執行期把切面織入到spring管理的bean中。**類會封裝目標類,並且攔截被通知黨法的呼叫。
spring只支援方法級別的連線點。
在spring aop中,使用aspectj的切點表示式語言來定義切點。spring只支援aspectj切點指示器(pointcut designator)的乙個子集,這裡要深入理解需要參考aspectj的相關資料。在spring支援的指示器中,只有execution指示器是實際執行匹配的,而其他的指示器都是用來限制匹配的。
先定義乙個介面:
如圖所示,使用execution()指示器選擇performance的perform()方法。方法表示式以「*」開始,表明可以返回任意型別。類名需要使用全限定型別,方法的引數列表使用兩個點號表明切點要選擇任意的perform()方法,因為可能存在多個過載的perform()方法。
如圖所示為使用within()指示器的樣例。
spring引入了乙個新的bean()指示器,它允許我們在切點表示式中使用bean的id來標識bean。bean()使用bean id或bean名稱作為引數來限制切點只匹配特定的bean。例如:
execution(* concert.performance.perform()) and bean('woodstock')
Spring面向切面程式設計
1 面向切面程式設計 aop 的概念 把專案中需要在多處用到的功能,比如日誌 安全和事物等集中到乙個類中處理,而不用在每個需要用到該功能的地方顯式呼叫。2 術語解釋 橫切關注點 分布應用於多處的功能 切面 橫切關注點可以被模組化為乙個類,這個類被稱為乙個切面 通知 advice 切面要完成的工作。s...
Spring學習筆記 面向切面程式設計(AOP)
在軟體開發中,散布於應用中多處的功能被稱為橫切關注點 cross cutting concern 通常來講,這些橫切關注點從概念上來講應該與應用的業務邏輯相分離 但是往往會直接嵌入到應用的業務邏輯中 把橫切關注點與邏輯相分離正是面向切面程式設計 aop 所要解決的問題。切面實現了橫切關注點 跨多個應...
Spring實戰4 4 註解切面
目錄 aspect cannot be resolved to a type 註解切面方式實現aop程式設計 1 先引入aop相關的jar檔案 2 配置spring idol.xml中引入aop命名空間 3 配置spring idol.xml中開啟aop註解掃瞄,如下配置所示 開發步驟 技巧 找到檔...