Spring AOP(execution表达式)

转载请注明来源-作者@loongshawn:http://blog.csdn.net/loongshawn/article/details/72303040,建议读者阅读原文,确保获得完整的信息

1.execution表达式

<aop:config>
        <aop:pointcut id="pointcut" expression="execution(* com.loongshawn.method.ces..*.*(..))" />
        <aop:aspect ref="logAspect">
            <aop:before pointcut-ref="pointcut" method="beforeAdvice"/>
            <aop:after-returning pointcut-ref="pointcut" arg-names="joinPoint,retValue" returning="retValue" method="afterAdvice"/>
        </aop:aspect>
    </aop:config>
 
 

      上述配置为AOP配置代码片段,其中expression部分为定义切点的表达式部分,如下:

    execution(* com.loongshawn.method.ces..*.*(..))

      注意:markdown中符号“*”是加粗,因此输出“*”符号需要进行转义“*”。

      表达式结构解释如下:

    标识符含义
    execution()表达式的主体
    第一个“*”符号表示返回值的类型任意
    com.loongshawn.method.cesAOP所切的服务的包名,即,需要进行横切的业务类
    包名后面的“..”表示当前包及子包
    第二个“*”表示类名,*即所有类
    .*(..)表示任何方法名,括号表示参数,两个点表示任何参数类型

    2.官方文档介绍

    execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern)
    throws-pattern?)

      上述表达式结构是Spring官方文档说明,翻译为中文如下,其中除了返回类型模式、方法名模式和参数模式外,其它项都是可选的。

    execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?)

      接下来,结合官方文档中的例子从不同的维度来了解execution表达式。表达式上方的中文说明为对该表达式的解释,请注意阅读方式。

    这里写图片描述维度1.通过方法修饰符定义切点

      匹配所有的public修饰符的方法:

    execution(public * *(..))

    这里写图片描述维度2.通过方法名定义切点

      匹配所有”set”开头的方法:

    execution(* set*(..))

    这里写图片描述维度3.通过类定义切点

      匹配AccountService 接口的所有方法:

    execution(* com.xyz.service.AccountService.*(..))

    这里写图片描述维度4.通过包定义切点

      匹配service包中的所有方法:

    execution(* com.xyz.service..(..))

      匹配service包及其子包中的所有方法:

    execution(* com.xyz.service...(..))

    这里写图片描述维度5.通过方法入参定义切点

      切点表达式中方法入参部分比较复杂,可以使用”*”和“..”通配符,其中“*”表示任意类型的参数,而“..”表示任意类型参数且参数个数不限。

      匹 配joke(String,int)方法,且joke()方法的第一个入参是String,第二个入参是int。如果方法中的入参类型是Java.lang包下的类,可以直接使用类名,否则必须使用全限定类名,如joke(java.util.List,int);

    execution(* joke(String,int))

      匹 配目标类中的joke()方法,该方法第一个入参为String,第二个入参可以是任意类型,如joke(Strings1,String s2)和joke(String s1,double d2)都匹配,但joke(String s1,doubled2,String s3)则不匹配;

    execution(* joke(String,*))

      匹配目标类中的joke()方法,该方法第 一个入参为String,后面可以有任意个入参且入参类型不限,如joke(Strings1)、joke(String s1,String s2)和joke(String s1,double d2,Strings3)都匹配。

    execution(* joke(String,..))

      匹 配目标类中的joke()方法,方法拥有一个入参,且入参是Object类型或该类的子类。它匹配joke(Strings1)和joke(Client c)。如果我们定义的切点是execution(*joke(Object)),则只匹配joke(Object object)而不匹配joke(Stringcc)或joke(Client c)。

    execution(* joke(Object+))

    3.官方文档截图

    Aspect Oriented Programming with Spring–>11.2.3 Declaring a pointcut
    https://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html

    这里写图片描述

    • 另增加:
    函数参数
     .. 匹配任类型意参数个数(包括没有) 
    * 匹配单个任意类型参数
    方法参数个数可以进行限制
     例如:(*,..) 匹配1个或1个以上任意类型参数,
     	  (*,*) 匹配两个任意类型参数
    

    本文仅对官方文档做了翻译及简要说明,需要在实际使用过程中加深印象及理解。

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

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

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

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值