@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()
函数判断代理对象的类是否按类型匹配指定类。
网友评论