【Spring AOP】切入点表达式(四)

一、切入点指示符

  切入点指示符用来指示切入点表达式目的,在Spring AOP中目前只有执行方法这一个连接点,Spring AOP支持的AspectJ切入点指示符如下:

  • execution:用于匹配方法执行的连接点;
  • within:用于匹配指定的类及其子类中的所有方法。
  • this:匹配可以向上转型为this指定的类型的代理对象中的所有方法。
  • target:匹配可以向上转型为target指定的类型的目标对象中的所有方法。
  • args:用于匹配运行时传入的参数列表的类型为指定的参数列表类型的方法;
  • @within:用于匹配持有指定注解的类的所有方法;
  • @target:用于匹配的持有指定注解目标对象的所有方法;
  • @args:用于匹配运行时 传入的参数列表的类型持有 注解列表对应的注解 的方法;
  • @annotation:用于匹配持有指定注解的方法;

  AspectJ切入点支持的切入点指示符还有: call、get、set、preinitialization、staticinitialization、initialization、handler、adviceexecution、withincode、cflow、cflowbelow、if、@this、@withincode;但Spring AOP目前不支持这些指示符,使用这些指示符将抛出IllegalArgumentException异常。

二、类型匹配语法

(1) *:匹配任何数量字符;

(2) ..:匹配任何数量字符的重复,如在类型模式中匹配任何数量子包;而在方法参数模式中匹配任何数量参数

(3) +:匹配指定类型的子类型;仅能作为后缀放在类型模式后边。

AspectJ使用 且(&&)、或(||)、非(!)来组合切入点表达式。
在Schema风格下,由于在XML中使用“&&”需要使用转义字符“&&”来代替之,所以很不方便,因此Spring ASP 提供了and、or、not来代替&&、||、!。

三、切入点指示符详解

1. execution

execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?)  除了返回类型模式、方法名模式和参数模式外,其它项都是可选的。

参数模式如下:

() 匹配一个不接受任何参数的方法
(..) 匹配一个接受任意数量参数的方法
(*) 匹配了一个接受一个任何类型的参数的方法
(*,String) 匹配了一个接受两个参数的方法,其中第一个参数是任意类型,第二个参数必须是String类型

举例:

#匹配所有目标类的public方法
execution(public * *(..))

#匹配所有以To为后缀的方法
execution(* *To(..))

#匹配Waiter接口中的所有方法
execution(* com.aop.learn.service.Writer.*(..))

#匹配Waiter接口中及其实现类的方法
execution(* com.aop.learn.service.Writer+.*(..))

#匹配 com.aop.learn.service 包下所有类的所有方法
execution(* com.aop.learn.service.*(..))

#匹配 com.aop.learn.service 包,子孙包下所有类的所有方法
execution(* com.aop.learn.service..*(..))

#匹配 包名前缀为com的任何包下类名后缀为ive的方法,方法必须以Smart为前缀
execution(* com..*.*ive.Smart*(..))

# 匹配 save(String name,int age) 函数
execution(* save(String,int))

#匹配 save(String name,*) 函数 第二个参数为任意类型
execution(* save(String,*))

#匹配 save(String name,..) 函数 除第一个参数固定外,接受后面有任意个入参且入参类型不限
execution(* save(String,..))

#匹配 save(String+) 函数  String+ 表示入参类型是String的子类
execution(* save(String+))

2. with 

within是用来指定类型的,指定类型中的所有方法将被拦截。

举例:

猜你喜欢

转载自www.cnblogs.com/myitnews/p/11553177.html