AOP AspectJ Pointcuts 表达式 语法 示例

Pointcut语法格式

Pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的。
Pointcut可以由下列方式来定义或者通过 && || 和 ! 的方式进行组合。
args()
@args()
execution()
this()
target()
@target()
within()
@within()
@annotation
9
9
 
1
args()
2
@args()
3
execution()
4
this()
5
target()
6
@target()
7
within()
8
@within()
9
@annotation
其中 execution 是用的最多的,其格式为:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
execution(修饰符? 返回值的类型 所属的类? 方法名(参数列表) 抛出的异常?)
 
1
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
2
execution(修饰符? 返回值的类型 所属的类? 方法名(参数列表) 抛出的异常?)
后面带 ? 的表示可以省略,returning type pattern 和 name pattern 和 parameters pattern是必须的。
  • modifiers-pattern:指定方法的修饰符,支持通配符,该部分可以省略
  • ret-type-pattern:指定方法的返回值类型,支持通配符,可以使用 * 通配符来匹配所有的返回值类型
  • declaring-type-pattern:指定方法所属的类,支持通配符,该部分可以省略
  • name-pattern:指定匹配指定的方法名,支持通配符,可以使用 * 通配符来匹配所有方法,也可以用 set* 匹配以 set 开头的所有方法
  • param-pattern:指定方法声明中的形参列表,支持两个通配符,即 * 和 .. ,其中 * 代表一个任意类型的参数,而 .. 代表零个或多个任意类型的参数。例如 :
    () 匹配一个不接受任何参数的方法
    (..) 匹配一个接受任意数量参数的方法
    (*) 匹配了一个接受一个任何类型的参数的方法
    (*,String) 匹配了一个接受两个参数的方法,其中第一个参数是任意类型,第二个参数必须是String类型

  • throws-pattern:指定方法声明抛出的异常,支持通配符,该部分可以省略

通配符和操作符

* 表示任何数量的字符,除了(.)
.. 表示任何数量的字符包括任何数量的(.)
+ 描述指定类型的任何子类或者子接口
同java一样,提供了一元和二元的条件表达操作符。
一元操作符:!
二元操作符:||和&&
优先权同java

案例1

类型签名样式

Account  类型Account
*Account  使用Account名称结束的类型,如SavingsAccount和CheckingAccount
java.*.Date  类型Date在任何直接的java子包中,如java.util.Date和java.sql.Date
java..*  任何在java包或者所有子包中的类型,如java.awt和java.util或者java.awt.event 和java.util.logging
javax..*Model+  所有javax包或者子包中以Model结尾的类型和其所有子类,如TableModel,TreeModel。
! vector  所有除了Vector的类型
Vector || Hashtable  Vector或者Hashtable类型
java.util.RandomAccess+  实现RandomAccess和List的所有子类
&& java.util.List+

方法和构造器签名模式

不使用通配符的例子
public void Account.debit(float) throws InsufficientBalanceException
x
 
1
public void Account.debit(float) throws InsufficientBalanceException
Account中以set开头,并且只有一个参数类型的方法
public void Account.set*(*)
1
1
 
1
public void Account.set*(*)
Account中所有的没有参数的public void 方法
public void Account.*()
1
1
 
1
public void Account.*()
Account中所有没有参数的public 方法
public * Account.*()
1
1
 
1
public * Account.*()
Account中所有的public 方法
public * Account.*(..)
1
1
 
1
public * Account.*(..)
Account中的所有方法,包括private方法
* Account.*(..)
1
1
 
1
* Account.*(..)
Account中的所有的非public 方法
!public * Account.*(..)
1
1
 
1
!public * Account.*(..)
Account中的所有的方法,包括子类的方法
* Account+.*(..)
1
1
 
1
* Account+.*(..)
所有的read方法
* java.io.Reader.read(..)
1
1
 
1
* java.io.Reader.read(..)
所有以read(char[])开始的方法,包括read(char[])和read(char[],int,int)
* java.io.Reader.read(char[],..)
1
1
 
1
* java.io.Reader.read(char[],..)
命名以add开始,以Listener结尾的方法,参数中为EventListener或子类
* javax..*.add*Listener(EventListener+)
1
1
 
1
* javax..*.add*Listener(EventListener+)
抛出RemoteException的所有方法
* *.*(..) throws RemoteException
1
1
 
1
* *.*(..) throws RemoteException

构造器签名模式

同上面, 没有参数的构造器方法
public Account.new()
1
1
 
1
public Account.new()

属性签名模式

同方法一样,属性也查不多
所有的Account属性
* Account.*  
1
1
 
1
* Account.*  
所有的非public static 属性,在banking的包或者子包中
!public static * banking..*.*
1
1
 
1
!public static * banking..*.*

案例2

任意公共方法的执行:
execution(public * *(..))
1
1
 
1
execution(public * *(..))
任何一个以 set 开始的方法的执行:
execution(* set*(..))
1
1
 
1
execution(* set*(..))
接口 com.xyz.service. AccountService 中的任意方法的执行:
execution(* com.xyz.service.AccountService.*(..))
1
1
 
1
execution(* com.xyz.service.AccountService.*(..))
定义在 com.xyz.service 包里的任意方法的执行:
execution(* com.xyz.service.*.*(..))
1
1
 
1
execution(* com.xyz.service.*.*(..))
定义在 com.xyz.service 包和所有子包里的任意类的任意方法的执行:
execution(* com.xyz.service..*.*(..))
1
1
 
1
execution(* com.xyz.service..*.*(..))
定义在 com.xyz.pointcutexp 包和所有子包里的 JoinPointObjP2 类的任意方法的执行:
execution(* com.xyz.pointcutexp..JoinPointObjP2.*(..))")
1
1
 
1
execution(* com.xyz.pointcutexp..JoinPointObjP2.*(..))")

2018-4-27




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值