Spring AOP @Pointcut 12种用法
2022-11-06 11:07:44 8 举报
AI智能生成
Spring AOP @Pointcut 12种用法
作者其他创作
大纲/内容
execution
使用 execution(方法表达式) 匹配方法执行
within
within(类型表达式) :目标对象target的类型是否和within中指定的类型匹配
匹配原则:target.getClass().equals(within表达式中指定的类型)
this
this(类型全限定名) :通过aop创建的代理对象的类型是否和this中指定的类型匹配;注意判断的目标是
代理对象;this中使用的表达式必须是类型全限定名,不支持通配符
代理对象;this中使用的表达式必须是类型全限定名,不支持通配符
匹配原则:如:this(x),则代理对象proxy满足下面条件时会匹配
x.getClass().isAssignableFrom(proxy.getClass());
x.getClass().isAssignableFrom(proxy.getClass());
target
target(类型全限定名) :判断目标对象的类型是否和指定的类型匹配;注意判断的是目标对象的类型;
表达式必须是类型全限定名,不支持通配符
表达式必须是类型全限定名,不支持通配符
匹配原则:如:target(x),则目标对象target满足下面条件时会匹配
x.getClass().isAssignableFrom(target.getClass());
x.getClass().isAssignableFrom(target.getClass());
args
args(参数类型列表) 匹配当前执行的方法传入的参数是否为args中指定的类型;注意是匹配传入的参数
类型,不是匹配方法签名的参数类型;参数类型列表中的参数必须是类型全限定名,不支持通配符;
args属于动态切入点,也就是执行方法的时候进行判断的,这种切入点开销非常大,非特殊情况最好不
要使用
类型,不是匹配方法签名的参数类型;参数类型列表中的参数必须是类型全限定名,不支持通配符;
args属于动态切入点,也就是执行方法的时候进行判断的,这种切入点开销非常大,非特殊情况最好不
要使用
举例:args(String) 匹配只有一个参数且传入的参数类型是String类型的方法
args(*,String) 匹配只有2个参数的且第2个参数类型是String的方法
args(..,String) 匹配最后1个参数类型是String的方法
args(*,String) 匹配只有2个参数的且第2个参数类型是String的方法
args(..,String) 匹配最后1个参数类型是String的方法
@within
@within(注解类型) :匹配指定的注解内定义的方法
匹配规则:调用目标方法的时候,通过java中 Method.getDeclaringClass() 获取当前的方法是哪个类中定义的,
然后会看这个类上是否有指定的注解;被调用的目标方法Method对象.getDeclaringClass().getAnnotation(within中指定的注解类型) !=
null
然后会看这个类上是否有指定的注解;被调用的目标方法Method对象.getDeclaringClass().getAnnotation(within中指定的注解类型) !=
null
@target
@target(注解类型) :判断目标对象target类型上是否有指定的注解;@target中注解类型也必须是全限
定类型名
定类型名
匹配规则:target.class.getAnnotation(指定的注解类型) != null
注解直接标注在目标类上
注解标注在父类上,但是注解必须是可以继承的,即定义注解的时候,需要使用 @Inherited 标注
@args
@args(注解类型):方法参数所属的类上有指定的注解;注意不是参数上有指定的注解,而是参数类型的
类上有指定的注解
类上有指定的注解
案例:@Pointcut("@args(Ann8)"):匹配方法只有一个参数,并且参数所属的类上有Ann8注解
@annotation
@annotation(注解类型):匹配被调用的方法上有指定的注解
bean
bean(bean名称):这个用在spring环境中,匹配容器中指定名称的bean
reference pointcut
表示引用其他命名切入点。
有时,我们可以将切入专门放在一个类中集中定义。
其他地方可以通过引用的方式引入其他类中定义的切入点
有时,我们可以将切入专门放在一个类中集中定义。
其他地方可以通过引用的方式引入其他类中定义的切入点
案例:@Pointcut("完整包名类名.方法名称()")
组合型的pointcut
Pointcut定义时,还可以使用&&、||、!运算符。
&&:多个匹配都需要满足
||:多个匹配中只需满足一个
!:匹配不满足的情况下
&&:多个匹配都需要满足
||:多个匹配中只需满足一个
!:匹配不满足的情况下
案例:@Pointcut("bean(bean1) || bean(bean2)") //匹配bean1或者bean2
@Pointcut("@target(Ann1) && @Annotation(Ann2)") //匹配目标类上有Ann1注解并且目标方法上
有Ann2注解
@Pointcut("@target(Ann1) && !@target(Ann2)") // 匹配目标类上有Ann1注解但是没有Ann2注解
@Pointcut("@target(Ann1) && @Annotation(Ann2)") //匹配目标类上有Ann1注解并且目标方法上
有Ann2注解
@Pointcut("@target(Ann1) && !@target(Ann2)") // 匹配目标类上有Ann1注解但是没有Ann2注解
0 条评论
下一页