一.表达式分类
切面表达式也可以直接写在Advice通知注解中
1.designators(指示器,比较复杂,后面专讲)
2.wildcards(通配符)
◆ * :匹配任意数量的字符
◆ + 匹配指定类及其子类
◆ .. 匹配任意数的子包(多级目录)或者参数
3.operators(运算符)
◆ && 与
◆ || 或
◆ ! 非
二.表达式分类designators的专讲
1.匹配方法:最常用
◆execution()
a.表达式结构:带问号的都是可选的
execution(<修饰符>? <返回类型> <包名>?<方法名>(<参数>)异常?)
execution(
modifier-pattern?
returnType-pattern
package-pattern?
methodName-pattern(args-pattern)
throwException-pattern?
)
execution(*[修饰符]? *[返回值] *[包路径]?*[方法名](..[参数])throw *[异常类]?)
b.案例:
1.修饰符匹配(modifier-pattern)(可选)
//匹配所有public修饰的方法
@Pointcut("execution(public * **(..))")
public void exTest1(){}
2.返回值匹配(returnType-pattern)
//匹配所有String或者void返回值的方法
@Pointcut("execution(String||void **(..))")
public void exTest2(){}
3.包路径匹配(package-pattern)
如果不使用..匹配到了类级别的名字,需要类.方法名………….
//com包下的所有类的方法
@Pointcut("execution(* com.*.*(..))")
public void exTest3(){}
//如果不使用..匹配到了类级别的名字,需要类.方法名.............
//com包下的所有子包的所有类的方法
@Pointcut("execution(* com..*(..))")
public void exTest4(){}
//com包下的所有子包的ProductService类的方法
@Pointcut("execution(* com..ProductService.*(..))")
public void exTest5(){}
4.方法名匹配(methodName-pattern)
//匹配所有test名字开头的方法
@Pointcut("execution(* test*(..))")
public void exTest6(){}
//匹配所有包含test名字的方法
@Pointcut("execution(* *test*(..))")
public void exTest7(){}
5.参数匹配(args-pattern)
//匹配所有参数列表的方法
@Pointcut("execution(* *(..))")
public void exTest8(){}
//匹配无参数列表的方法
@Pointcut("execution(* *())")
public void exTest9(){}
6.异常匹配(throwsException-pattern)
//匹配所有抛过异常的方法
@Pointcut("execution(* *()throws *)")
public void exTest10(){}
//只匹配所有抛出空指针异常的方法
@Pointcut("execution(* *()throws NullPointerException)")
public void exTest11(){}
2.匹配注解(使用了能被继承的注解的类,其子类也会被匹配):
◆@annotation():方法注解匹配
//方法注解匹配,匹配所有带AspectAnnotation注解的方法
@Pointcut("@annotation(com.tiglle.manage.annotation.AspectAnnotation)")
public void test(){
}
◆@target():类注解匹
//匹配所有使用了AspectAnnotation注解的 类 的所有方法(要求注解的RetentionPolicy的级别为CLASS)
@Pointcut("@within(com.tiglle.manage.AspectAnnotation)")
public void withinMatch(){}
◆@arges():类注解匹配
//匹配所有使用了AspectAnnotation注解的 类 的所有方法(要求注解的RetentionPolicy的级别为RUNTIME)
@Pointcut("@target(com.tiglle.manage.AspectAnnotation)")
public void targetMatch(){}
◆@within():参数注解匹配
//匹配所有使用了AspectAnnotation注解的 参数 的方法
@Pointcut("@args(com.tiglle.manage.AspectAnnotation)")
public void argsMatch(){}
3.匹配包/类
◆within()
1.如果传的是全类名(包名.类名):匹配此类下所有的方法
//匹配TestService类中的所有方法
@Pointcut("within(com.tiglle.service.TestService)")
public voud test(){}
2.如果传的时包名:匹配此包下所有类的方法
//匹配com/tiglle/包下所有包和子包中的类中的所有方法
@Pointcut("within(com.tiglle..*)")
public voud test(){}
4.匹配对象
◆this():匹配代理对象(或普通类)和其子类
//匹配代理对象和普通对象及其所有子类的方法
@Pointcut("this(com.tiglle.manage.service.ProductService)")
public void thisMatch(){
}
◆target():匹配原始对象(或普通类)和其子类
//匹配目标对象和普通对象及其所有子类的方法
@Pointcut("target(com.tiglle.manage.service.ProductService)")
public void targetMatch(){
}
◆bean():根据bean的名称进行匹配
//根据spring容器的bean的名称(id)匹配,(不匹配子类)
@Pointcut("bean(productService)")
public void beanMatch(){
}
5.匹配参数
◆args()
1.匹配spring容器所有此参数类型和列表的方法(String,Long)
//匹配spring容器所有此参数类型和列表的方法(String,Long)
@Pointcut("args(String,Long)")
public void argsMatch(){}
2.匹配spring容器所有此参数类型和列表的方法(Long)
//匹配spring容器所有此参数类型和列表的方法(Long)
@Pointcut("args(Long)")
public void argsMatch1(){}
3.匹配spring容器所有此参数类型和列表的方法(第一个为Long,后面随意)
//匹配spring容器所有此参数类型和列表的方法(第一个为Long,后面随意)
@Pointcut("args(Long,..)")
public void argsMatch2(){}
4./匹配spring容器所有此参数类型和列表的方法(前面随意,最后一个为Long)
//匹配spring容器所有此参数类型和列表的方法(前面随意,最后一个为Long)
@Pointcut("args(..,Long)")
public void argsMatch3(){}
5.匹配spring容器所有此参数类型和列表的方法(无参数列表)
//匹配spring容器所有此参数类型和列表的方法(无参数列表)
@Pointcut("args()")
public void argsMatch4(){}
6.匹配spring容器所有此参数类型和列表的方法(任意参数列表(包括无参数))
//匹配spring容器所有此参数类型和列表的方法(任意参数列表(包括无参数))
@Pointcut("args(..)")
public void argsMatch5(){}