@AspectJ 支持三种通配符
* 匹配任意字符,只匹配一个元素
.. 匹配任意字符,可以匹配多个元素 ,在表示类时,必须和 * 联合使用
+ 表示按照类型匹配指定类的所有类,必须跟在类名后面,如 com.cad.Car+ ,表示继承该类的所有子类包括本身
逻辑运算符
切点表达式由切点函数组成,切点函数之间还可以进行逻辑运算,组成复合切点。
&&:与操作符。相当于切点的交集运算。xml配置文件中使用切点表达式,&是特殊字符,所以需要转义字符&;来表示。||:或操作符。相当于切点的并集运算。!:非操作符,相当于切点的反集运算。
Spring 支持 9 个 @AspectJ 切点表达式函数,它们用不同的方式描述目标类的连接点。我们来了解几个常用的
execution()
execution()是最常用的切点函数,用来匹配方法
语法:
execution(<修饰符><返回类型><包.类.方法(参数)><异常>)
修饰符和异常可以省略。
使用例子
execution(public * *(..)):匹配目标类的所有public方法,第一个*代表返回类型,第二个*代表方法名,..代表方法的参数。execution(**User(..)):匹配目标类所有以User为后缀的方法。第一个*代表返回类型,*User代表以User为后缀的方法execution(* com.cad.demo.User.*(..)):匹配 User 类里的所有方法execution(* com.cad.demo.User+.*(..)):匹配该类的子类包括该类的所有方法execution(* com.cad.*.*(..)):匹配 com.cad 包下的所有类的所有方法execution(* com.cad..*.*(..)):匹配 com.cad 包下、子孙包下所有类的所有方法execution(* addUser(Spring, int)):匹配 addUser 方法,且第一个参数类型是 String,第二个参数类型是 int
args()
args()函数接受一个类名,表示目标类方法参数是指定类时(包含子类),则匹配切点。
args(com.cad.User) :匹配 addUser(User user) 方法等
within()
匹配类
语法:
within(<类>)
within(com.cad.User) :匹配 User 类下的所有方法
target()
target()函数通过判断目标类是否按类型匹配指定类决定连接点是否匹配。
target(com.cad.User) :如果目标类类型是 User 类那么目标类所有方法都匹配切点。
this()
this()函数判断代理对象的类是否按类型匹配指定类。