首页 > 代码库 > 基于@AspectJ和schema的aop(三)---切点函数详解

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

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

1.@annotation()

  @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,后面可以有任意多个入参,且类型不限

      •      

 

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