Spring複習 六 之AOP細節

2021-10-06 16:32:22 字數 3786 閱讀 7513

通過表示式的方式定位乙個或多個具體的連線點。

①切入點表示式的語法格式

execution

([許可權修飾符]

[返回值型別]

[簡單類名/全類名]

[方法名]

([引數列表]

))

記住兩種;

&&:我們要切入的位置滿足這兩個表示式

mymathcalculator.

add(

int,

double

)execution

(public

int com.atguigu.

.mymath*

.*(..)

)&&execution(*

*.*(

int,

int)

)

||:滿足任意乙個表示式即可

execution

(public

int com.atguigu.

.mymath*

.*(..)

)||execution(*

*.*(

int,

int)

)

!:只要不是這個位置都切入

!

execution

(public

int com.atguigu.

.mymath*

.*(..)

)

抽取可重用的切入點表示式;

1、隨便宣告乙個沒有實現的返回void的空方法

2、給方法上標註@pointcut註解

3、 直接方法名就可以引用

@pointcut

("execution(public int com.atguigu.impl.mymathcalculator.*(..))"

)public

void

hahamypoint()

;@before

("hahamypoint()"

)public

static

void

logstart

(joinpoint joinpoint)

通知方法的執行順序;

try

catch()

finally

正常執行: @before(前置通知)------->@after(後置通知)------->@afterreturning(正常返回)

異常執行: @before(前置通知)------->@after(後置通知)------->@afterthrowing(方法異常)

切入點表示式通常都會是從巨集觀上定位一組方法,和具體某個通知的註解結合起來就能夠確定對應的連線點。那麼就乙個具體的連線點而言,我們可能會關心這個連線點的一些具體資訊,例如:當前連線點所在方法的方法名、當前傳入的引數值等等。這些資訊都封裝在joinpoint介面的例項物件中。

在通知方法的引數加上joinpoint joinpoint,通過 joinpoint獲取目標方法的資訊

@before

("execution(public int com.atguigu.impl.mymathcalculator.*(..))"

)public

static

void

logstart

(joinpoint joinpoint)

通知方法的引數spring是有嚴格要求的:joinpoint joinpoint spring是知道的

要在通知方法上新增其他引數,並用註解告訴spring框架

我們可以在通知方法執行的時候,拿到目標方法的詳細資訊;

只需要為通知方法的引數列表上寫乙個引數:

joinpoint joinpoint:封裝了當前目標方法的詳細資訊

告訴spring哪個引數是用來接收異常

throwing="exception":用註解引數告訴spring哪個引數是用來接收異常

通知方法引數exception exception:指定通知方法可以接收哪些異常

類似於

ajax接受伺服器資料

$.post

(url,

function

(abc)

)

@afterthrowing

(value=

"execution(public int com.atguigu.impl.mymathcalculator.*(..))"

,throwing=

"exception"

)public

static

void

logexception

(joinpoint joinpoint,exception exception)

3.告訴spring這個result用來接收目標方法返回值: 註解returning="result"

//想在目標方法正常執行完成之後執行

@afterreturning

(value=

"execution(public int com.atguigu..mymath*.*(..))"

,returning=

"result"

)public

static

void

logreturn

(joinpoint joinpoint,object result)

spring對通知方法的要求不嚴格;

唯一要求的就是方法的引數列表一定不能亂寫?

@around

("execution(public int tju.impl.calculatorimpl.*(int, int))"

)public object myaround

(proceedingjoinpoint pjp)

throws throwable

catch

(exception e)

finally

//反射呼叫後的返回值也一定返回出去

return proceed;

}

try

catch

(e)finally

[普通前置]

catch()

finally

}[普通後置]

[普通方法返回/方法異常]

新的順序:

(環繞前置—普通前置)----目標方法執行----環繞正常返回/出現異常-----環繞後置----普通後置—普通返回或者異常

當logutils切面類加環繞的時候

注意壞繞只影響當前切面

1)aop加日誌儲存到資料庫;

2)aop做許可權驗證;

3)aop做安全檢查;

4)aop做事務控制;

Spring框架 AOP細節

知己海記憶體 2016 11 24 10 17 1切入點表示式 1.1作用 通過表示式的方式定位乙個或多個具體的連線點。1.2語法細節 切入點表示式的語法格式 execution 許可權修飾符 返回值型別 簡單類名 全類名 方法名 引數列表 舉例說明 表示式execution com.atguigu...

Spring知識點兒複習AOP

掘金小冊 從0開始學習spring aop面向切面程式設計,在不修改業務 的前提下,使用執行時動態 對已有的邏輯進行功能擴充套件 aop 在底層,借助annotationawareaspectjautoproxycreator在 bean 的初始化流程,postprocessafterinitial...

spring學習之AOP 三

四個bean定義的次序並不重要。我們現在有了乙個advice,乙個包含了正規表示式pointcut的advisor,乙個主程式類和乙個配置好的介面,通過工廠ctx,這個介面返回自己本身實現的乙個引用。beanimpl和testbeforeadvice都是直接配置。我們用乙個唯一的id建立乙個bean...