Spring Aop切點

切點用於準肯定位應該在什麼地方應用切面的通知。通知和切點是切面的最基本的元素。在Spring AOP中要使用AspectJ的切點表達式來定義切點。下面咱們列出Spring AOP所支持的AspectJ切點指示器。php

 
AOP原理圖
AspectJ指示器 描述
arg() 限定鏈接點匹配參數爲指定類型的執行方法
@args() 限定鏈接點匹配參數由指定註解標註的執行方法
execution() 用於匹配鏈接點執行的方法
this() 限定鏈接點匹配AOP代理的類型bean引用爲指定類型的類
target() 限定鏈接點匹配目標對象爲指定類型的類
@target() 限定鏈接點匹配特定的執行對象,這些對象對應的類要有指定類型的註解
within() 限定匹配鏈接點指定的類型
@within() 限定匹配鏈接點指定註解所標註的類型(當使用Spring AOP時,方法定義在指定的註解所標註的類裏)
@annotation 限定匹配帶有特定註解的鏈接點

在Spring 中嘗試使用AspectJ其餘的的指示器,將會拋出IllegalArgumentException異常。咱們看到在上面介紹的指示器中只有execution()是實際執行匹配的,而其餘指示器都是限制匹配的。因此咱們一般使用execution指示器匹配,而後經過其餘指示器進行限制。css

1.編寫切點

爲了闡述Spring中的切面,咱們要限定一個切點:java

public interface Performance { public void perform(); } 

下面咱們定義一個表達式,設置當perform()執行時觸發通知的調用:this

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

第一個*表明匹配全部類型的返回值,中間的類名.方法名指定匹配的類的特定方法,()中的 .. 表示匹配全部的參數列表。
咱們好能夠在ececution中使用其餘的匹配器,用來過濾匹配的方法:spa

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

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

2.在切點中選擇bean

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

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

在這裏咱們限定了bean的ID爲 woodstock,其實bean()指示器更多的使用場景是 除去特定ID的bean應用通知:code

execution(* concert.Perfirmance.perform(..)  and !bean('woodstock'))
做者:郭之源 連接:https://www.jianshu.com/p/0dc2eea8e59e 來源:簡書 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
相關文章
相關標籤/搜索