切點(diǎn)用于準(zhǔn)確定位應(yīng)該在什么地方應(yīng)用切面的通知客税。通知和切點(diǎn)是切面的最基本的元素碧信。在Spring AOP中要使用AspectJ的切點(diǎn)表達(dá)式來(lái)定義切點(diǎn)巧婶。下面我們列出Spring AOP所支持的AspectJ切點(diǎn)指示器钳幅。
AspectJ指示器 | 描述 |
---|---|
arg() | 限定連接點(diǎn)匹配參數(shù)為指定類型的執(zhí)行方法 |
@args() | 限定連接點(diǎn)匹配參數(shù)由指定注解標(biāo)注的執(zhí)行方法 |
execution() | 用于匹配連接點(diǎn)執(zhí)行的方法 |
this() | 限定連接點(diǎn)匹配AOP代理的類型bean引用為指定類型的類 |
target() | 限定連接點(diǎn)匹配目標(biāo)對(duì)象為指定類型的類 |
@target() | 限定連接點(diǎn)匹配特定的執(zhí)行對(duì)象,這些對(duì)象對(duì)應(yīng)的類要有指定類型的注解 |
within() | 限定匹配連接點(diǎn)指定的類型 |
@within() | 限定匹配連接點(diǎn)指定注解所標(biāo)注的類型(當(dāng)使用Spring AOP時(shí)泛豪,方法定義在指定的注解所標(biāo)注的類里) |
@annotation | 限定匹配帶有特定注解的連接點(diǎn) |
在Spring 中嘗試使用AspectJ其他的的指示器,將會(huì)拋出IllegalArgumentException異常。我們看到在上面介紹的指示器中只有execution()是實(shí)際執(zhí)行匹配的诡曙,而其他指示器都是限制匹配的臀叙。所以我們通常使用execution指示器匹配,然后通過(guò)其他指示器進(jìn)行限制价卤。
1.編寫(xiě)切點(diǎn)
為了闡述Spring中的切面劝萤,我們要限定一個(gè)切點(diǎn):
public interface Performance {
public void perform();
}
下面我們定義一個(gè)表達(dá)式,設(shè)置當(dāng)perform()執(zhí)行時(shí)觸發(fā)通知的調(diào)用:
execution(* concert.Perfirmance.perform(..))
第一個(gè)*代表匹配所有類型的返回值慎璧,中間的類名.方法名指定匹配的類的特定方法床嫌,()中的 .. 表示匹配所有的參數(shù)列表。
我們好可以在ececution中使用其他的匹配器,用來(lái)過(guò)濾匹配的方法:
execution(* concert.Perfirmance.perform(..) && within(concer.*))
上面的表達(dá)式表示匹配concert.Perfirmance的perform方法胸私,并且該方法在concer包中厌处。里面的&&表示與的意思,除此之外還有 || 表示或盖文, 嘱蛋! 表示非。但是 & 在Xml中有特殊的含義五续,這時(shí)我們也可以使用 and 代替 && 洒敏,用 or 代替 || ,用 not 代替 疙驾!凶伙。
2.在切點(diǎn)中選擇bean
處理上面;列出的指示器外它碎,Spring還支持一種新的指示器bean(),它允許我們?cè)谇悬c(diǎn)中使用bean的ID來(lái)標(biāo)示bean:
execution(* concert.Perfirmance.perform(..) and bean('woodstock'))
在這里我們限定了bean的ID為 woodstock函荣,其實(shí)bean()指示器更多的使用場(chǎng)景是 除去特定ID的bean應(yīng)用通知:
execution(* concert.Perfirmance.perform(..) and !bean('woodstock'))
在這種場(chǎng)景下,切面的通知會(huì)被編織到所有ID不為woodstock的bean中扳肛。本節(jié)我們大致介紹了切點(diǎn)的定義與幾種使用場(chǎng)景傻挂,下節(jié)我們會(huì)學(xué)習(xí)如何編寫(xiě)通知和使用這些切點(diǎn)聲明切面。