• Spring AOP (二)


    下面介绍@AspectJ语法基础

    一、切点表达式函数

          AspectJ的切点表达式由关键字和操作参数组成,如execution(* greetTo(..)) 的切点表达式,execution为关键字,而 *  greetTo(..) 为操作参数。  两者联合起来表示目标类greeTo(..) 方法的连接点.

             Spring支持9个@AspectJ切点表达式函数,它们用不同的方式连接目标类的连接点,根据描述对象的不同,可以大致分为四种类型:

    •         方法切点函数:通过描述目标类方法信息定义连接点;
    •         方法入参切点函数:通过描述目标类方法入参的信息定义连接点;
    •         目标类切点函数:通过描述目标类类型信息定义连接点;
    •         代理类期切点函数:通过描述 目标类的代理类的信息定义连接点。                  



    二、在函数入参中使用通配符

         有些函数的入参可以接受通配符,@AspectJ支持3种通配符:

    •      *        匹配任意字符,但它只能匹配上下文中的一个元素;
    •      ..        匹配任意字符,可以匹配上下文中的多个元素,但在表示类时,必须和 *  联合使用,而在表示入参时则单独使用;
    •     +        表示按类型匹配指定类的所有类,必须跟在类名后面,如 com.baobaotao.Car+   ,继承或扩展指定类的所有类,同时还包括指定类本身.

         @AspectJ函数按其是否支持通配符及支持的程度,可以分为:

    •      支持所有通配符:execution()、within(),如within(com.baobaotao.*)、within(com.baobaotao..*.*Service+) 等?
    •      仅支持+通配符:args()、this()、target(),如args(com.baobaotao.Waiter+)、target(java.util.List+) 等 。虽然这三个函数可以支持+通配符,但其意义不大,因为对于这些函数来说,使用和不使用+都是一样的.

    •       不支持通配符: @args()、@within()、@target和@annotation。

    注:args()、this()、target()、@args()、@this()、@target() 和@annotation这 7个函数除了可以指定类名外,也可以指定变量名,并将目标对象中的变量绑定到增强的方法中。



    三、逻辑运算符

              切点表达式由切点函数组成,切点函数之间还可以进行逻辑运算,组成复合节点,Spring支持以下的切点运算符:

               (1)  &&  与操作符,相当于切点的交集运算,如果在Spring 的XML配置文件中使用切点表达式,由于&是XML特殊字符,所有使用转义字符&& 表示。为了使用方便,Spring提供了一个等效的运算符"and"。如

                      within(com.baobaotao..*) and args(String) 表示在com.baobaotao包下所有类(当前包以及子包)拥有一个String入参的方法;

               (2)    ||  或操作符,相等于切点的并集运算,or是等效的操作符。

               (3)   ! 操作符 ,相当于切点的反集运算, not  是等效的操作符.

      

        四、不同的增强类型

               @Before 

                 前置增强,相当于BeforeAdvice的功能,Before注解类拥有两个成员:

                 value :该成员用于定义切点;

                 argsNames:由于无法通过Java反射机制获取方法入参名,所以如果在Java编译时未启用调试信息获取需要在运行期解析切点,就必须通过这个成员指定注解所标注增强方法的参数名(注意两者名字必须相同),多个参数名用逗号分隔。


               @AfterReturning

                    后置增强,相当于AfterReturningAdvice,AfterReturning注解类拥有四个成员:

                   value : 该成员用于定义切点;

                   pointcut :表示切点的信息,如果显示指定pointcut值,它将覆盖value的设置值,可以将pointcut成员看成是value的同义词;

                  returning :将目标对象方法的返回值绑定给增强的方法;

                 argNames: 如前所述.


                @Around 

                        环绕增强,相当于MethodInterceptor,Around注解y类拥有两个成员;

                         value: 该成员用于定义切点;

                         argNames:如前所述


               @AfterThrowing

                    抛出增强,相当于ThrowsAdvice,AfterThrowing注解类拥有四个成员:

                    value :该成员用于定义切点; 

                    pointcut:表示切点的信息,如果显示指定pointcut值,它将覆盖value的设置值,可以将pointcut成员看成是value的同义词;

                   throwing :将抛出的异常绑定到增强方法中;

                   argNames:如前所述

       

                @After 

                       Final增强,不管是抛出异常或者是正常退出,该增强都会得到执行,该增强没有对应的增强接口,可以把它看成是ThrowsAdvice和AfterReturningAdvice的混合物,一般用于释放资源,相当于try{} finazlly{}的控制流,Afteer注解类拥有两个成                    员:

                       value :该成员用于定义切点; 

                       args:如前所述


               @DeclareParents  

                   引介增强,相当于IntroductionInterceptor,DeclareParents注解类拥有两个成员:

                   value:  该成员用于定义切点,它表示在哪个目标类上引用引介增强;

                   defaultImpl: 默认的接口实现类。




  • 相关阅读:
    Java Web总结十Jsp
    当前结果
    QFontMetrics的一个问题
    设想的用户交互流程
    多视图工作
    改进函数、变量的表示
    接口测试Session/Cookie笔记(二)
    接口测试笔记(一)
    创业公司心力交瘁
    禅道BUG管理工具使用链接存储
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300346.html
Copyright © 2020-2023  润新知