Spring Aop PointCut
精华帖:https://blog.csdn.net/qq_23167527/article/details/78623639
五种连接点Pointcut表达式概要
- execution
表达式用于匹配方法执行join point连接点,表达式的最小粒度是方法,使用最多。
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?)
-
?表示当前项可以有也可以没有
-
modifiers-pattern:方法的可见性,如public,protected;
-
ret-type-pattern:方法的返回值类型,如int,void等;
-
declaring-type-pattern:方法所在类的全路径名,如com.test.User;
-
name-pattern:方法名类型,如log();
-
param-pattern:方法的参数类型,如String, Integer;
-
throws-pattern:方法抛出的异常类型,如java.lang.Exception;
例子:
//匹配com.test.dao包下的任意接口和类的任意方法
@Pointcut(“execution(* com.test.dao..(…))”)
//匹配com.test.dao包下的任意接口和类的public方法
@Pointcut(“execution(public * com.test.dao..(…))”)常见写法:
@Pointcut("execution( com.test.controller..(…))")*
解释:- . execution(): 表达式主体。
- 第一个*号:表示返回类型,*号表示所有的类型。
- 包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包
- 第二个*号:表示类名,*号表示所有的类。
- *(…):最后这个星号表示方法名,*号表示所有的方法,
- 后面括弧里面表示方法的参数,两个句点表示任何参数。
-
within & @within
表达式的最小粒度为类例子:
//匹配com.test.dao包中的任意方法
@Pointcut(“within(com.tset.dao.)")
//匹配com.test.dao包及其子包中的任意方法
@Pointcut("within(com.test.dao…)”)
注意:. 和…
@within 等同于@target -
args & @args
表达式是匹配指定参数类型和指定参数数量的方法,与包名和类名无关。例子:
//匹配运行时传递的参数类型为指定类型的、且参数个数和顺序匹配
@Pointcut(“args(java.test.User)”)
//接受一个参数,并且传递的参数的运行时类型具有@Valid的对象
@Pointcut("@args(com.test.Valid)") -
this
在使用JDK代理时,代理对象指向接口和代理类Proxy,使用cglib代理时,代理对象指向接口和子类。
我理解是调用类或接口例子:
//配置代理接口和类
@Pointcut(“this(com.test.dao.UserDao)”) -
target & @target
表达式指向被代理对象的接口和子类例子:
//匹配被代理对象的全限定名
@Pointcut(“target(com.test.dao.impl.UserDaoImpl)”)
//匹配有特定注解的对象的执行方法,注解类型必须是全限定名
@Pointcut("@target(com.test.Valid)")