Spring AOP 之 通知 連線點 切點 切面

2021-08-08 14:35:35 字數 2900 閱讀 5310

軟體系統可以看成是由一組關注點組成的,其中,直接的業務關注點,是直切關注點。而為直切關注點提供服務的,就是橫切關注點。

什麼是面向切面程式設計

橫切關注點:影響應用多處的功能(安全、事務、日誌)

切面:

橫切關注點被模組化為特殊的類,這些類稱為切面

優點:

每個關注點現在都集中於一處,而不是分散到多處**中 

服務模組更簡潔,服務模組只需關注核心**。

aop 術語

before——在方法呼叫之前呼叫通知

after——在方法完成之後呼叫通知,無論方法執行成功與否

after-returning——在方法執行成功之後呼叫通知

after-throwing——在方法丟擲異常後進行通知

around——通知包裹了被通知的方法,在被通知的方法呼叫之前和呼叫之後執行自定義的行為

切點:

切面:

引入:

織入:

編譯期——切面在目標類編譯時期被織入,這種方式需要特殊編譯器。aspectj的織入編譯器就是以這種方式織入切面。

類載入期——切面在類載入到

jvm ,這種方式需要特殊的類載入器,他可以在目標類被引入應用之前增強該目標類的位元組碼。aspectj5 的 ltw 就支援這種織入方式

執行期——切面在應用執行期間的某個時刻被織入。一般情況下,在織入切面時候,aop 容器會為目標物件動態的建立**物件。spring aop 就是以這種方式織入切面。

spring 提供的 4 種各具特色的 aop 支援

基於**的經典 aop;

@aspectj 註解驅動的切面;

純 pojo 切面;

注入式 aspectj 切面; spring

spring 支援方法建立連線點 

aspectj 指示器

描述arg ()

限制連線點的指定引數為指定型別的執行方法

@args ()

限制連線點匹配引數由指定註解標註的執行方法

execution ()

用於匹配連線點的執行方法

this ()

限制連線點匹配 aop **的 bean 引用為指定型別的類

target ()

限制連線點匹配特定的執行物件,這些物件對應的類要具備指定型別註解

within()

限制連線點匹配指定型別

@within()

限制連線點匹配指定注釋所標註的型別(當使用 spring aop 時,方法定義在由指定的註解所標註的類裡)

@annotation

限制匹配帶有指定注釋的連線點

1. 建立自己的切點 

- execution( ) 指示器選擇 instrument 的 play( ) 方法。 

方法表示式是以 * 號開頭,標識了我們不關心的方法返回值的型別。 

* 後我們指定了許可權定類名和方法名。 

對於方法的引數列表,使用(..)標識切點選擇任意的 play( ) 方法,無論入參是什麼。 

- 假設我們需要匹配切點僅匹配 com.springinaction.springidol 包。可以使用 within() 

注意 && 是將 execution( ) 和 within( ) 連線起來,形成的 and 關係。同理也可以使用 || 或關係、!非關係 

- 建立 spring 的 bean( ) 指示器 

spring 2.5 引入乙個新的 bean( ) 指示器,該指示器允許我們在切點表示式中使用 bean id 來標識 bean 

bean( ) 使用 bean id 或 bean 名稱作為引數來限制切點只匹配特定 bean。 

如下,我們希望執行 instrument 的 play( ) 方法時候應用通知,但限定 bean 的 id 為 eddie 

還可以使用非操作作為除了指定 id 的 bean 以外的其他 bean應用通知 

在此場景下,切面會通知被編織到所有 id 不為 eddie 的 bean 中

spring 的 aop 配置元素簡化了基於 pojo 切面宣告

aop 配置元素

描述aop : advisor

定義 aop 通知器

aop : after

定義 aop 後置通知(不管被通知方法是否執行成功)

aop : after-returing

定義 aop after-returing 通知

aop : after-throwing

定義 aop after-throwing 通知

aop : around

定義 aop 環繞通知

aop : aspect

定義切面

aop : aspectj-autoproxy

啟動 @aspectj 註解驅動的切面

aop : before

定義 aop 前置通知

aop : config

頂層的 aop 配置元素,大多數 aop : * 元素必須包含在 元素內

aop : declare-parents

為被通知的物件引入額外介面,並透明的實現

aop : pointcut

定義切點

from: 

spring AOP前後通知

在搭建spring的時候要求的5個jar包的基礎上新增4個jar包,總共九個jar包 然後是配置檔案的寫法,如下 開始 結束 然後最主要的是前置通知和後置通知的類和方法了 前置通知,如下 開始 package com.dao.impl import org.aspectj.lang.joinpoin...

Spring AOP通知順序

spring aop的主要註解 before after afterreturning afterthrowing around 的執行順序是什麼?spring版本不同,執行順序也不同,這裡討論spring4和spring5 spring4,after在 afterreturning或 aftert...

關於Spring Aop 通知型別

1.前置通知 在目標類的方法執行之前執行。配置檔案資訊 應用 可以對方法的引數來做校驗 2.最終通知 在目標類的方法執行之後執行,如果程式出現了異常,最終通知也會執行。在配置檔案中編寫具體的配置 應用 例如像釋放資源 3.後置通知 方法正常執行後的通知。在配置檔案中編寫具體的配置 應用 可以修改方法...