面向切面編程--AOP

1、aop:aspect oriented programming 面向切面編程

2、aop在spring中作用

     提供聲明式事務(聲明式服務)

      允許用戶實現自定義切面

3、aop:在不改變原有代碼的情況下,增加新的功能

      傳統的編程模式: 自上而下縱向的編程

      jsp

      action

      service

       dao

 

  Aop的編程模式:橫向的編程

   service模塊←(橫切service)Log()     :可以參照之前的動態代理結合來看

4、aop的優勢

      a)使真實角色處理的業務更加的精準,不用再去關注公共的東西

      b)公共的業務由代理來完成------實現了業務的分工

      c)公共業務發生擴展時變得更加集中和方便

5、關注點:增加某個/種業務。比如log(日誌)、安全、緩存、事務等。

      切面:一個關注點的模塊化,這個關注點可能會橫切多個對象(比如之前的代理中的Log橫切了service中的userservice,;Log也可以橫切adminService)  切面註解:@Aspect

       連接點:在程序執行過程中某個特定的點,比如執行add的時候Log會切入這個點

       通知:在切面的某個特定的連接點上執行的動作.其中有around before after等不同類型的通知

        切入點:匹配連接點的斷言。通知和一個切入點表達式關聯,並在滿足這個切入點的連接點上運行(比如,當執行某個特定名稱的方法時).切入點表達式如何和連接點匹配是Aop的核心:Spring缺省使用Aspect切入點語法

        織入:吧切面連接到其他的應用程序類型或者對象上,並創建一個被通知的對象。

        目標(Target): 被通知的對象

        代理(Proxy): 向目標對象應用通知之後創建的對象 

  AOP的重要性 :

         SpringAOP就是將公共的業務(入日誌、安全等)和領域業務結合。當執行領域業務時將會把公共業務加進來。

         實現公共業務的重複利用。領域業務更精準,我們寫程序的可以更加專注於領域業務。其本質還是動態代理。

在 Spring 中啓用 AspectJ 註解支持

要在 Spring 應用中使用 AspectJ 註解, 必須在 classpath 下包含 AspectJ 類 庫: aopalliance.jar、aspectj.weaver.jar 和 spring-aspects.jar

將 aop Schema 添加到 根元素中

要在 Spring IOC 容器中啓用 AspectJ 註解支持, 只要在 Bean 配置文件中定義 一個空的 XML 元素

當 Spring IOC 容器偵測到 Bean 配置文件中的 元素時 , 會自動爲與 AspectJ 切面匹配的 Bean 創建代理.

用 AspectJ 註解聲明切面

要在 Spring 中聲明 AspectJ 切面, 只需要在 IOC 容器中將切面聲 明爲 Bean 實例. 當在 Spring IOC 容器中初始化 AspectJ 切面之 後, Spring IOC 容器就會爲那些與 AspectJ 切面相匹配的 Bean 創 建代理.

在 AspectJ 註解中, 切面只是一個帶有 @Aspect 註解的 Java 類.

通知是標註有某種註解的簡單的 Java 方法.

前置通知

利用方法簽名編寫 AspectJ 切入點表達式

最典型的切入點表達式時根據方法的簽名來匹配各種方法: n execution * com.atguigu.spring.ArithmeticCalculator.*(..): 匹配 ArithmeticCalculator 中聲明的所有方法,第一個 * 代表任意修飾符及任意 返回值. 第二個 * 代表任意方法. .. 匹配任意數量的參數. 若目標類與接 口與該切面在同一個包中, 可以省略包名. n execution public * ArithmeticCalculator.*(..): 匹配 ArithmeticCalculator 接口的所有公有方法. n execution public double ArithmeticCalculator.*(..): 匹配 ArithmeticCalculator 中返回 double 類型數值的方法 n execution public double ArithmeticCalculator.*(double, ..): 匹配第 一個參數爲 double 類型的方法, .. 匹配任意數量任意類型的參數 n execution public double ArithmeticCalculator.*(double, double): 匹 配參數類型爲 double, double 類型的方法.

 

合併切入點表達式

讓通知訪問當前連接點的細節

 可以在通知方法中聲明一個類型爲 JoinPoint 的參數. 然後就能訪問 鏈接細節. 如方法名稱和參數值.

後置通知

後置通知是在連接點完成之後執行的, 即連接點返回結果或者拋出異常的時 候, 下面的後置通知記錄了方法的終止. n 一個切面可以包括一個或者多個通知.

返回通知

n 無論連接點是正常返回還是拋出異常, 後置通知都會執行. 如果只想 在連接點返回的時候記錄日誌, 應使用返回通知代替後置通知.

在返回通知中訪問連接點的返回值

在返回通知中, 只要將 returning 屬性添加到 @AfterReturning 注 解中, 就可以訪問連接點的返回值. 該屬性的值即爲用來傳入返回值 的參數名稱. n 必須在通知方法的簽名中添加一個同名參數. 在運行時, Spring AOP 會通過這個參數傳遞返回值. n 原始的切點表達式需要出現在 pointcut 屬性中

異常通知

只在連接點拋出異常時才執行異常通知 n 將 throwing 屬性添加到 @AfterThrowing 註解中, 也可以訪問連接 點拋出的異常. Throwable 是所有錯誤和異常類的超類. 所以在異常 通知方法可以捕獲到任何錯誤和異常. n 如果只對某種特殊的異常類型感興趣, 可以將參數聲明爲其他異常的 參數類型. 然後通知就只在拋出這個類型及其子類的異常時才被執行.

環繞通知

環繞通知是所有通知類型中功能最爲強大的, 能夠全面地控制連接點. 甚至可以控制是否執行連接點.

對於環繞通知來說, 連接點的參數類型必須是 ProceedingJoinPoint . 它是 JoinPoint 的子接口, 允許控制何時執行, 是否執行連接點.

在環繞通知中需要明確調用 ProceedingJoinPoint 的 proceed() 方 法來執行被代理的方法. 如果忘記這樣做就會導致通知被執行了, 但 目標方法沒有被執行.

注意: 環繞通知的方法需要返回目標方法執行之後的結果, 即調用 joinPoint.proceed(); 的返回值, 否則會出現空指針異常

指定切面的優先級

在同一個連接點上應用不止一個切面時, 除非明確指定, 否則它們的 優先級是不確定的. n 切面的優先級可以通過實現 Ordered 接口或利用 @Order 註解指定. n 實現 Ordered 接口, getOrder() 方法的返回值越小, 優先級越高. n 若使用 @Order 註解, 序號出現在註解中

重用切入點定義

在編寫 AspectJ 切面時, 可以直接在通知註解中書寫切入點表達式. 但同一個切點表達式可能會在多個通知中重複出現. n 在 AspectJ 切面中, 可以通過 @Pointcut 註解將一個切入點聲明成 簡單的方法. 切入點的方法體通常是空的, 因爲將切入點定義與應用 程序邏輯混在一起是不合理的. n 切入點方法的訪問控制符同時也控制着這個切入點的可見性. 如果切 入點要在多個切面中共用, 最好將它們集中在一個公共的類中. 在這 種情況下, 它們必須被聲明爲 public. 在引入這個切入點時, 必須將 類名也包括在內. 如果類沒有與這個切面放在同一個包中, 還必須包 含包名. n 其他通知可以通過方法名稱引入該切入點.

重用切入點定義示例代碼

引入通知

引入通知是一種特殊的通知類型. 它通過爲接口提供實現類, 允許對 象動態地實現接口, 就像對象已經在運行時擴展了實現類一樣.

用基於 XML 的配置聲明切面

除了使用 AspectJ 註解聲明切面, Spring 也支持在 Bean 配置文件 中聲明切面. 這種聲明是通過 aop schema 中的 XML 元素完成的.

正常情況下, 基於註解的聲明要優先於基於 XML 的聲明. 通過 AspectJ 註解, 切面可以與 AspectJ 兼容, 而基於 XML 的配置則是 Spring 專有的. 由於 AspectJ 得到越來越多的 AOP 框架支持, 所以 以註解風格編寫的切面將會有更多重用的機會.

當使用 XML 聲明切面時, 需要在 根元素中導入 aop Schema n 在 Bean 配置文件中, 所有的 Spring AOP 配置都必須定義在 元素內部. 對於每個切面而言, 都要創建一個 元素來爲具體的切面實現引用後端 Bean 實例. n 切面 Bean 必須有一個標示符, 供 元素引用

切入點使用

 元素聲明 n 切入點必須定義在 元素下, 或者直接定義在 元素下. n 定義在 元素下: 只對當前切面有效 n 定義在 元素下: 對所有切面都有效 n 基於 XML 的 AOP 配置不允許在切入點表達式中用名稱引用其他切入 點.

在 aop Schema 中,

 每種通知類型都對應一個特定的 XML 元素. n 通知元素需要使用 來引用切入點, 或用 直接嵌入切入點表達式. method 屬性指定切面類中通知方法的名稱

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章