首页 > 代码库 > 基于@AspectJ和schema的aop(二)---@AspectJ基础语法

基于@AspectJ和schema的aop(二)---@AspectJ基础语法

  @AspectJ使用jdk5.0和正规的AspectJ切点表达式描述切面, 由于spring只支持方法的连接点,所以Spring只支持部分AspectJ的切点语言.

1.切点表达式函数

  AspectJ 5的切点表达式有关键字和操作参数组成,如execution(* greetTo(..))的切点表达式, execution为关键字, "* greetTo(..)"为操作参数.在这里execution表示目标类执行某一方法, 而"* greetTo(..)"描述目标方法的匹配模式, 两者联合起来表示目标类greetTo()方法的连接点.为了描述方便, 将execution()称作为函数, 而将匹配串"* greetTo(..)"称为函数的入参.

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

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

这四种类型的切点函数, 通过下表进行详细说明:

类别 函数 入参 说明
方法切点函数 execution() 方法匹配模式 表示满足某一模式的所有目标类方法连接点, 如execution(* greetTo(..))表示所有目标类中的greetTo()方法
@annotation() 方法注解类名 表示标注了特定注解的目标方法连接点, 如@annotation(com.bao.bao.aop.NeedTest)表示任何标注了@NeedTest注解的目标类方法
方法入参切点函数
args() 类名 通过判断目标类方法运行时入参对象的类型定义指定连接点.如args(com.bao.bao.Waiter)表示所有有且仅有一个按类型匹配于Waiter入参的方法
@args() 类型注解类名 通过判断目标方法运行时入参对象的类型是否标注特定注解来指定连接点, 如@args(com.bao.bao.Monitorable)表示任何这样的一个目标方法, 它有一个入参且入参对象的类标注了@Monitorable注解
目标类切点函数 within() 类名匹配器 表示特定域下的所有连接点.如within(co.bao.bao.service.*)表示com.bao.bao.service包中的所有连接点.即包中所有的类的所有方法, 而within(com.bao.bao.service.*Service)表示在com.bao.bao.
代理类切点函数      

 

基于@AspectJ和schema的aop(二)---@AspectJ基础语法