Spring Aop基礎使用

2021-06-22 06:15:29 字數 4018 閱讀 3304

說到spring,想必大家一定就馬上想到了,哦spring不就是幫助管理bean物件,封裝資料源,提供事務管理的東西麼。的確,平常在使用spring的時候,用到最多的就是spring提供的這些功能了,其實spring還有乙個挺好的東西,或許大家平常用得少一些,他就叫aop。 

什麼aop, 這是什麼玩意兒, 我只知道oop, aop是誰,他舅麼? 哈哈,開個玩笑,oop是物件導向程式設計, aop其實叫面向切面程式設計,反正都是程式設計,就表示你都要寫**就好了. it屌絲,反正都是搬磚打熬氣力的活。

至於aop的詳細介紹,小弟這裡就不多說了,到處一搜就出來了, 我這裡想說的一點就是,通常使用aop的目的,都是我們想在某乙個方法執行前,或者執行後 再額外的執行一些**,但是我們又不像去修改已經寫好的業務**。

好了,在開始aop之前,我們先來了解一下與aop相關的幾個名詞,當然如果你是第一次使用aop的話,你不妨先跳過這些名詞,先試著把下面的例子,完整的錄入你的專案,跑起來看看效果,然後再回過頭來理解這些名詞。

1. aspect 切面: 哦喲,真巧哦, aop是面向切面程式設計,aspect又是切面,那不就是面向aspect程式設計麼..當然你要這麼理解也行,只要記得,我們**要編寫的就是aspect就行了. aspect就是關注點的模組化,乙個aspect可以切多個物件,想切誰就切誰...

2.jointpoint 連線點:這代表程式執行中的某一行為, 通常我們把他定位到業務中的某個具體的方法,也就是我們想在這個方法的執行前,或者執行後額外的再執行一些**,那麼我們現在關注的這個方法,就是jointpoint

3.advice 通知:通知就是切面對於某個連線點所產生的動作,這裡動作就相當於我們額外執行的**。

4.pointcut 切入點:這只要記得pointcut就是乙個表示式,這個表示式的作用就是把通知(advice)和連線點(jointpoint)關聯起來,讓advice作用到jointpoint上就ok了.

ok,話不多說,上**了(似乎已經說了很多了.....),假設這段例子我們想實現乙個核心功能叫play(), 這個功能一呼叫,我們就能玩小霸王遊戲機,

這個功能已經寫好了, 但是現在我想在玩小霸王之前,檢查一下周圍的環境,看是否適合玩小霸王,為什麼要檢查呢? 嘿,問得好,萬一我打算玩小霸王

中的乙個遊戲叫電什麼狼什麼(當然小霸王中沒有這個電什麼狼什麼的遊戲,有的話小霸王估計就不會沒落了,哈哈,***)的,你認為你能在大廳廣眾之下毫無顧忌的玩起來?? 總之我就想在玩之前檢查一下環境, 在玩之後在收拾一下戰場,收拾一下電源,4合1,3合1的卡,紙巾什麼的..但是又不想在已經寫好的play**中來修改,

那怎麼辦呢,好吧我們先寫乙個aspect

public class aspectforplay 

public void doafter(joinpoint joinpoint)

public object doaround(proceedingjoinpoint pjp) throws throwable

}

當然還有我們的核心邏輯play()功能,先來個play的介面

public inte***ce playxbwservice

再來實現這個介面,展示我們玩的內容:

public class playxbwserviceimple implements playxbwservice 

}

當然啦,最後還有spring的配置檔案

可以看到aop的配置,主要是在的標籤中來實現的。接下來,寫個類,讓我們寫個類試一試吧:

public class aspecttest 

@test

public void testplayxbw()

}

ok, 當我們執行這個測試類之後,結果如下:

開玩之前檢查環境:com.andy.springaop.playxbwserviceimple.play

playing:小霸王其樂無窮

結束之後收拾戰場:com.andy.springaop.playxbwserviceimple.play

順利通關,打完收工:2

怎麼樣,是不是在我們play()的前後,都插入了一些額外的處理呢..  這些處理就是我們aspectforplay類中編寫的方法

可以看到在aspect類中,我們編寫了三個方法, doafter, dobefore, doaround,其實他們分別對應的是「後置通知」, 「前置通知」,「環繞通知」

通知advise也不止這麼幾種, 下面就是全部的通知型別了:

1. 後置通知(after advice) : 後置通知表示在連線點執行之後 額外執行的操作,在spring中,我們用來配置他

2. 前置通知(before advice):前置通知表示在連線點執行之前 額外執行的操作,在spring中,我們用來配置他

3. 環繞通知(around advice):表示在連線點 執行前後,額外執行的操作,另外注意環繞通知可以控制連線點的執行哦,如**中的:object proceed = pjp.proceed(); 如果沒有這一句,連線點就不會執行了, 在spring中,我們用來配置他

4. 返回後通知(after return advice):表示在連線點正常執行完之後,額外執行的操作, 注意是正常執行完哦, 在spring中,我們用來配置他

5. 跑出異常通知(after throwing advice):表示在程式丟擲異常後,額外執行的操作,在spring中,我們用來配置他

示例程式中,我們只寫了前三種通知,後兩種鼓勵讀者自行嘗試, 另外在示例程式中的advice我們可以看到,都有乙個jointpoint物件作為引數, 當然環繞通知是proceedingjointpoint物件, 這個jointpoint物件包含了連線點的資訊以及**物件的資訊, 是很有用的哦。。 當然我們在寫advice的時候,也可以不要這個引數。。

另外對於pointcut,我們前面提到 他是乙個連線通知與連線點的表示式,那麼這個表示式的書寫規範如下:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) 

throws

-pattern?) 

modifiers-pattern: 方法許可權 如private public等

ret-type-pattern: 方法返回值型別 如void string等

declaring-type-pattern: 方法所在包 如com.andy.springaop等

name-pattern:方法名 如play等

throws-pattern: 異常型別 比如ioexception等

ok, 到這裡spring aop的基礎使用就差不多了, 另外spring還支援註解式的aop配置,這樣我們在spring的配置檔案中,就不用再配置了,只需要一句:

配置就完事了,當然既然是基於注意,自然就還要開啟spring的註解掃瞄功能了:   

好了,下面附上基於註解的, aspect檔案的示例:

@aspect

public class aspectforplay

@after("execution(* com.andy.springaop.*.*(..))")

public void doafter(joinpoint joinpoint)

@around("execution(* com.andy.springaop.*.*(..))")

public object doaround(proceedingjoinpoint pjp) throws throwable

}

最後, 我們看到例子中,用的aop是基於介面的, 那基於類的情況下,aop能否使用呢,答案是肯定的.. 

只是基介面和基於類時,spring所使用的動態**不一樣而已,具體不一樣的地方,有條件可以自行翻閱spring原始碼研究哦。

springAOP使用詳情

aop分為兩種方式 xml配置和註解 aspect,pointcut和 advice pointcut expression 切面表示式 指示器 designators execution 和其他 萬用字元 wildcards 和邏輯運算子 和!萬用字元 表示匹配任意數量的字元,匹配指定類及其之類 ...

spring aop筆記(使用demo)

定義 連線點 joinpoint 程式執行過程中的某一行為,例如,aserviceimpl.bara 的呼叫或者bserviceimpl.barb string msg,int type 丟擲異常等行為。通知 advice 切面 對於某個 連線點 所產生的動作,例如,testaspect中對com....

Spring AOP理解與使用

如果你想要使用aop,那麼正面spring框架基本已經會配置了,那麼就不再做詳述 1.特點 不改變原有的邏輯 的情況下,給系統增加新的功能,如事務控制 異常日誌資訊等 如圖所示,不改變controller和service之間的 增加對應的spring aop 功能 2.配置檔案spring aop....