AspectJ形式的Pointcut--spring揭秘学习笔记

@AspectJ形式的Pointcut的声明包含如下两个部分:

  • Pointcut Expression:其载体为@Pointcut,该注解是方法级别的注解,所以Pointcut Expression不能脱离某个方法单独声明,被附着的的方法的名称是Pointcut Designature。Pointcut Expression是真正规定Pointcut匹配规则的地方,可以通过 @Pointcut直接制定AspectJ形式的Pointcut表达式;AspectJ形式的Pointcut由以下两部分组成:
    • Pointcut标志符:标志符以什么行为来匹配表达式(execution|this|target|args)
      -表达式匹配模式:具体的匹配规则
  • Pointcut Signature:Pointcut的附着方法,它是Pointcut Expression的载体,该方法除了返回类型必须是void之外,没有其他的限制,访问修饰符的语义和Java相同。在当前的AspectJ定义中可以取代重复的Pointcut的定义。
    Pointcut可以通过&&、||、 !运算符进行逻辑间的运算。

@AspectJ形式的Pointcut表达式的标识符
1. execution:Spring Aop只支持方法执行类别的Jointpoint,所以execution将是用到的最常多的标识符,其定义方式如下:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern (param-pattern) throws-pattern?):其中的?表示可以省略的项,返回类型、方法名称、参数是匹配模式必须指定的。
除此之外,还可以使用和. .通配符,其中 可以用于任何部分匹配模式中,可以匹配多个字符(及一个词),eg:
execution(* ( )):代表任意的返回类型,任意的方法,任意的参数
. .通配符可以用在两个位置上,一个是declaring-type-pattern规定的位置,一个是param-pattern规定的位置,如用在declaring-type-pattern的位置上,则可以表示多个层次结构的类型声明,eg:
(execution (void cn.spring21..doSomething( ))) //代表指定到cn.spring21*这一层下*的多有类型
(execution(void cn.spring21...doSomething( ))) //代表指定到cn.spring21这一层及其所有的子层次的类型
.. 若是用在参数列表位置,则表示0个或者多个参数,类型不限,eg:
execution(void doSomething(String,*)) //匹配两个参数的doSomething()方法,第一个参数是String类型,第二个参数是任意类型;
execution(void doSomething(..,String)) //匹配拥有多个参数的doSomething()方法,前面的参数的个数和类型不限,最后一个参数的类型必须是String类型;
execution(void doSomething(*,String,..)) //匹配拥有多个参数的doSomething()方法,第一个参数的类型不限,第二个参数必须为String类型,后面的参数的个数和类型都不限;
2.within标识符只接受类型声明,他将会匹配指定类型下的所有的Jointpoint。但是因为SpringAop只支持方法级别的Jointpint,所以在我们为within指定某个类后,它将匹配指定类所声明的所有方法执行,eg:
within(cn.spring21.aop.target.MockTarget) //该Pointcut表达式在SpringAop中将会匹配MockTarget类中的所有的方法声明,除此之外还可以结合上面的* 和.. 进行扩展
3.this和target:若Object1和Object2都调用了Object3方法,在ApsectJ中this指的是方法调用方:Object1和Objection2,target指的是方法具体的执行调用方;this(Object1)&&target(Object3),表示只有在Object1调用Object3的方法时时才会执行匹配,Object2调用Object3的方法是不会执行匹配;而在SpringAop中this和target的语义有所差别,下图是Spring 官方文档中的截图:
这里写图片描述
可以看出:this和target都是限制匹配joinpoint的方式,但是this限制的是对于给出类型的SpringAop代理类的限制(我猜想是在一个原始目标类实现多个接口时,在为其生成代理对象并注入到Spring的IoC容器之后,之后我们业务逻辑中使用的就是代理类对象,当我们执行代理类的方法时,SpringAop使用this(原始类实现的某一个接口),这种Pointcut定义方式对代理类中的特定接口中定义的方法进行拦截,并且执行Advice中定义的逻辑),而target限制的是对于原始类中的方法的匹配,与哪一个特定的接口都没有关系;
这里写图片描述
这里写图片描述
4.args:该标识符的作用是捕捉拥有特定类型的、特订参数个数的方法级的Joinpoint,而不管方法是在什么类型中声明;args与execution的区别在于,args会在程序运行期间动态的检查参数的类型,即使是传入声明类型的子类型,也可以进行匹配,但是execution则匹配不到该Joinpoint
5.@within:如果使用@within指定了某类型的注解,那么只要对象标注了该类型的注解,使用了@within标识符的@Pointcut就会匹配该对象内部的所有的joinpoint
6.@target:如果使用@target指定了某类型的注解,那么只要对象标注了该类型的注解,使用了@target标识符的@Pointcut就会匹配该对象内部的所有的joinpoint,与@within的不同是:@within属于静态的匹配,而@target属于运行时动态的匹配
7.@args:使用@args标识符的Pointcut将会尝试检查当前所有的Joinpoint方法参数,如果该次传入的类型拥有@args所指定的注解,当前Joinpoint将被匹配
8.@annotation:使用@annotation标识符的Pointcut表达式,将会尝试检查系统所有对象的所有的方法级别的Joinpoint,若被检测的方法标注有@annotation标识符所指定的注解类型,那么当前方法所在的Joinpoint将被Pointcut表达式所匹配,@annotation的标识符的应用场景比较广泛

总而言之,使用步骤分为:自定义注解或者匹配模式,在Aspect中定义@Pointcut(“注解或者是匹配模式”),定义匹配命中后的执行逻辑Advice,并将自定义好的注解运用在业务代码的场景中,完成SpringAop的自动代理。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值