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.ces AOP所切的服务的包名,即,需要进行横切的业务类
    包名后面的“..” 表示当前包及子包
    第二个“*” 表示类名,*即所有类
    .*(..) 表示任何方法名,括号表示参数,两个点表示任何参数类型

    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个以上任意类型参数,
     	  (*,*) 匹配两个任意类型参数
    

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

    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章