Spring的AOP之通過切點來選擇連接點

切點用于準確定位應(yīng)該在什么地方應(yīng)用切面的通知。通知和切點是切面的最基本的元素。在Spring AOP中要使用AspectJ的切點表達式來定義切點。下面我們列出Spring AOP所支持的AspectJ切點指示器。

AOP原理圖
AspectJ指示器 描述
arg() 限定連接點匹配參數(shù)為指定類型的執(zhí)行方法
@args() 限定連接點匹配參數(shù)由指定注解標注的執(zhí)行方法
execution() 用于匹配連接點執(zhí)行的方法
this() 限定連接點匹配AOP代理的類型bean引用為指定類型的類
target() 限定連接點匹配目標對象為指定類型的類
@target() 限定連接點匹配特定的執(zhí)行對象,這些對象對應(yīng)的類要有指定類型的注解
within() 限定匹配連接點指定的類型
@within() 限定匹配連接點指定注解所標注的類型(當使用Spring AOP時,方法定義在指定的注解所標注的類里)
@annotation 限定匹配帶有特定注解的連接點

在Spring 中嘗試使用AspectJ其他的的指示器,將會拋出IllegalArgumentException異常。我們看到在上面介紹的指示器中只有execution()是實際執(zhí)行匹配的,而其他指示器都是限制匹配的。所以我們通常使用execution指示器匹配,然后通過其他指示器進行限制。

1.編寫切點

為了闡述Spring中的切面,我們要限定一個切點:

public interface Performance {
    
    public void perform();
}

下面我們定義一個表達式,設(shè)置當perform()執(zhí)行時觸發(fā)通知的調(diào)用:

匹配表達式
execution(* concert.Perfirmance.perform(..))

第一個*代表匹配所有類型的返回值,中間的類名.方法名指定匹配的類的特定方法,()中的 .. 表示匹配所有的參數(shù)列表。
我們好可以在ececution中使用其他的匹配器,用來過濾匹配的方法:

execution(* concert.Perfirmance.perform(..) && within(concer.*))

上面的表達式表示匹配concert.Perfirmance的perform方法,并且該方法在concer包中。里面的&&表示與的意思,除此之外還有 || 表示或, ! 表示非。但是 & 在Xml中有特殊的含義,這時我們也可以使用 and 代替 && ,用 or 代替 || ,用 not 代替 !。

2.在切點中選擇bean

處理上面;列出的指示器外,Spring還支持一種新的指示器bean(),它允許我們在切點中使用bean的ID來標示bean:

execution(* concert.Perfirmance.perform(..)  and bean('woodstock'))

在這里我們限定了bean的ID為 woodstock,其實bean()指示器更多的使用場景是 除去特定ID的bean應(yīng)用通知:

execution(* concert.Perfirmance.perform(..)  and !bean('woodstock'))

在這種場景下,切面的通知會被編織到所有ID不為woodstock的bean中。本節(jié)我們大致介紹了切點的定義與幾種使用場景,下節(jié)我們會學(xué)習(xí)如何編寫通知和使用這些切點聲明切面。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,628評論 19 139
  • 本章內(nèi)容: 面向切面編程的基本原理 通過POJO創(chuàng)建切面 使用@AspectJ注解 為AspectJ切面注入依賴 ...
    謝隨安閱讀 3,425評論 0 9
  • 還記得小時候玩壞了多少手柄嗎?對于80年代的童鞋來說,正好趕上了游戲機興起的時代,也真是這些游戲機的出現(xiàn)讓我們的童...
    23歲的馬里奧閱讀 1,277評論 0 0
  • 我不知道專情這樣的詞語,是好是壞,褒義或者貶義,甚至,有用么。 當歲月逝去,而你還在原地駐足,長大了,心里還是同一...
    奈芒閱讀 297評論 0 2
  • 素材來源:《那些怪誕又實用的日常心理學(xué)》,理查德?懷斯曼(英) 成功,除了付出努力,還需要人擁有一雙能發(fā)現(xiàn)機遇的眼...
    墨霜閱讀 438評論 0 1

友情鏈接更多精彩內(nèi)容