基于@AspectJ和schema的aop(三)---切点函数详解

  切点函数是AspectJ表达式语言的核心, 也是使用@AspectJ进行切面定义的难点.本小节我们通过具体的实例对切点函数进行深入学习.

[email protected]()

  @annotation()表示标注了某个注解的所有方法,这个比较简单.

2.execution()

  execution()是最常使用的切点函数,其语法如下:

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

  除了返回类型模式, 方法名模式, 参数模式是必须的外,其他两个都不是必须的

  (1) 通过方法签名定义切点

      • execution(public * *(..))

        匹配所有目标类的public 方法, 第一个*号代表返回类型, 第二个*号代表方法名.而..代表任意的入参

      • execution(* *To(..))

        匹配目标类所有以To结尾的方法, 第一个*代表返回类型, *To代表所有以To结尾的方法

  (2) 通过类定义切点

      • execution(* com.bao.bao.Waiter.*(..))

        匹配Waiter接口的所有方法, 第一个*号代表返回任意类型, com.bao.bao.Waiter.*代表Waiter接口中的任意方法

      • execution(* com.bao.bao.Waiter+.*(..))

        匹配Waiter接口及其所有实现类的方法, 这个和上面的区别在于,这个不但匹配Waiter接口中定义的方法, 还匹配Waiter实现类中定义的方法(但不在Waiter接口中定义),而上面的那个只匹配Waiter接口中定义的方法

      (3) 通过类包定义切点

        在类名模式串中, ".*"表示包下的所有类, 而"..*"表示包, 子孙包下的所有类

        • execution(* com.bao.bao.*(..))

            匹配com. bao.bao包下所有类的所有方法

        • execution(* com.bao.bao..*(..))

            匹配com.bao.bao包,子孙包下所有类的所有方法. ".."出现在类名中时, 后面必须跟"*"表示包,子孙包下的所有类

        • execution(* com..*.*Dao.find*(..))

            匹配包名前缀为com的任何包下类名后缀为Dao的方法, 方法名必须以find为前缀.

      (4) 通过方法入参定义切点

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

        • execution(* joke(String, *))

            匹配目标类中的joke()方法, 该方法第一个入参为String, 第二个入参可以是任意类型

        • execution(* joke(String, ..)) 

            匹配目标类中的joke()方法, 该方法第一个入参为String,后面可以有任意多个入参,且类型不限

        •      
    时间: 2024-10-14 01:23:36

    基于@AspectJ和schema的aop(三)---切点函数详解的相关文章

    基于@AspectJ和schema的aop(一)

    在前面我们使用Pointcut和Advice描述切点和增强, 并使用Advisor整合两者描述切面[email protected]使用注解来描述切点和增强.两者使用的方式不同, 但是在本质上都是一样的. 我们还是用以前的例子来举例, 学习如何使用@AspectJ来描述切点和增强.首先看一个简单的例子. package com.bao.bao.aspectj; /** * Created by xinfengyao on 16-10-23. */ public interface Waiter

    基于@AspectJ和schema的aop(二)[email&#160;protected]基础语法

    @AspectJ使用jdk5.0和正规的AspectJ切点表达式描述切面, 由于spring只支持方法的连接点,所以Spring只支持部分AspectJ的切点语言. 1.切点表达式函数 AspectJ 5的切点表达式有关键字和操作参数组成,如execution(* greetTo(..))的切点表达式, execution为关键字, "* greetTo(..)"为操作参数.在这里execution表示目标类执行某一方法, 而"* greetTo(..)"描述目标方

    基于@AspectJ和schema的aop(四)[email&#160;protected]进阶

    @AspectJ可以使用切点函数定义切点, 我们还可以使用逻辑运算对切点进行复合运算得到复合的切点. 我们还可以对切点进行命名, 从而可以复用切点.当一个连接点匹配多个切点时, 需要考虑增强织入的顺序.还有一个在前面提到过的问题就是, 如何访问在增强中访问连接点上下文信息.下面对这几方面进行学习. 1.对切点进行复合运算 使用切点进行复合运算, 使得我们能够拥有强大的表达切点的能力.例子如下: package com.bao.bao.aspectj; import org.aspectj.lan

    动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)

    x动态载入 DLL 动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行过程中根据需要决定应调用哪些函数. 方法是:用 LoadLibrary 函数加载动态链接库到内存,用 GetProcAddress函数动态获得 DLL 函数的入口地址.当一个 DLL 文件用 LoadLibrary 显式加载后,在任何时刻均可以通过调用 FreeLibrary 函数显式地从内存中把它给卸载. 动态调用使用的 Windows API 函数主要有 3 个, 分别是 LoadLibrary.

    文件和目录详解(三)---access函数详解

    当在进程中使用open打开一个文件的时候,内核在测试权限的时候是基于进程的有效用户ID 来测试的,但是如果我们想要测试进程的实际用户 ID 对文件的权限的时候该怎么办?Linux提供了access函数来实现此功能.当没有设置set-user-id位的时候,实际用户和有效用户是一致的.设置了set-user-id位后,实际用户和有效用户才有可能不一样. ======================================================= 函数原型: 函数参数: pathn

    小曹学spring--基于@AspectJ和Schema的AOP

    前言: 上一章中已经介绍,Spring中定义一个切面是比较麻烦的,需要实现专门的接口,并进行一些较为复杂的配置.经过改进,如今Spring AOP已经焕然一新,用户可以使用@AspectJ注解非常容易的定义一个切面,而不需要实现任何接口. 对于jdk5.0以下的项目,则可以通过基于Schema的配置定义切面 1.Spring对AOP的支持 spring2.0以后对AOP功能进行了重要的增强,主要变现在以下几个方面: 新增了基于Schema的配置支持,为AOP提供了专门的aop命名空间: 新增了对

    Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AOP编程比较

    本篇博文用一个稍复杂点的案例来对比一下基于XML配置与基于AspectJ注解配置的AOP编程的不同. 相关引入包等Spring  AOP编程准备,请参考小编的其他博文,这里不再赘述. 案例要求: 写一个简单的实现四则运算的计算器. 加入AOP功能:日志功能:检测参数中是否有负数的功能. 废话不多说了,直接上代码: (一)基于XML配置: 定义了一个接口类: package com.edu.aop; public interface ArithmeticCalculator { int add(i

    Spring基于事件驱动模型的订阅发布模式代码实例详解

    代码下载地址:http://www.zuidaima.com/share/1791499571923968.htm 原文:Spring基于事件驱动模型的订阅发布模式代码实例详解 事件驱动模型简介 事件驱动模型也就是我们常说的观察者,或者发布-订阅模型:理解它的几个关键点: 首先是一种对象间的一对多的关系:最简单的如交通信号灯,信号灯是目标(一方),行人注视着信号灯(多方): 当目标发送改变(发布),观察者(订阅者)就可以接收到改变: 观察者如何处理(如行人如何走,是快走/慢走/不走,目标不会管的

    Android研究之为基于 x86 的 Android* 游戏选择合适的引擎详解

    摘要 游戏开发人员知道 Android 中蕴藏着巨大的机遇. 在 Google Play 商店的前 100 款应用中,约一半是游戏应用(在利润最高的前 100 款应用中,它们所占的比例超过 90%). 如要跻身该市场,开发速度非常关键. 一些刚起步的独立开发人员更愿意从零开始来开发自己的所有代码:但是为了达到更高的质量而不用花费数年的时间进行开发,其他人可能会选择已有的游戏引擎.上章研究了英特尔 Android* 开发人员指南上的对等应用详解,在选择引擎时,你可以考虑以下几个因素: 成本 - 你