Spring in Acton 4 读书笔记之 AOP 的语法

字数686 大约花费3分钟

目录

  1. 1. AspectJ 的语法
  2. 2. Spring 添加的 bean 函数

在之前的读书笔记 Spring in Acton 4 读书笔记之 AOP 原理及 Spring 对 AOP 的支持 中,讲解了 AOP 的各个组成部分,其中 pointcut 和 advice 组成了 aspect,是 AOP 的基础。本文对应 Spring in Action(Spring 实战)第四版的第四章第二节(4.2 Selecting join points with pointcuts)的内容,将讲解 aspect 特别是 pointcut 的语法。

Spring 中的表达式主要使用 AspectJ 的表达式,另外,添加了一个自己的 bean()函数。

AspectJ 的语法

Spring 的 AOP 中,pointcut 使用 AspectJ 的一部分 pointcut 语法表达式,可使用的表达式如下:

  • args(),匹配的函数,其参数的类型必须是 args()指定的类型
  • @args(),匹配的函数,其参数必须被 @args 指定的标签标注
  • execution(),匹配指定的函数
  • this(),匹配的函数,它的 AOP 代理实例必须是指定的类型
  • target(),匹配的函数, 所在类必须是指定的类型
  • @target(),匹配的函数, 所在类必须由指定类型的标签标注
  • within(),匹配的函数, 所在类必须是指定的类型之一
  • @within(),匹配的函数,所在类必须由指定类型之一的标签标注(使用 Spring AOP 时,定义的方法必须在由指定类型之一的标签标注的类中)
  • @annotation,匹配的函数,其自身必须由指定的标签标注。

如果尝试使用 AspectJ 的其它语法,Spring 会抛出 IllegalArgumentException 异常。

上面的这些表达式中,实际上,只有 execution 是真正实行匹配的,其它的是进行进一步限制。

下面举例说明 execution 的使用。

execution 语法

可以看到,这里指定了方法为 concert.Performance.perform,既指定了类,也指定了方法。这个例子中,“..”表示参数没有进行限制,”*”表示返回类型也没有进行限制。

1
2
execution(* concert.Performance.perform(..))
&& within(concert.*)

execution 和 within 方法使用 && 进行关联,表示”与“,即两个条件都要满足,此外,可以使用 || 表示或,! 表示非。也可以使用”and”,”or”和”not”。注:书中的例子有笔误,最后面多了一个多余的括号,我这里把它去掉了。

Spring 添加的 bean 函数

Spring 添加了 bean() 函数,声明 join point 必须是指定 id 的 bean,例子如下:

1
2
execution(* concert.Performance.perform())
and bean('woodstock')

表示只能作用在 id 为 woodstock 的 bean 的 perform 方法上。而下面的这个例子表示作用在 id 不是 woodstock 的 bean 的 perform 方法上。

1
2
execution(* concert.Performance.perform())
and !bean('woodstock')

谈谈 IT的文章均为原创或翻译(翻译会注明外文来源),转载请以链接形式标明本文地址: http://tantanit.com/springinacton4-du-shu-bi-ji-zhi-aop-de-yu-fa/

谈谈IT

欢迎关注官方微信公众号获取最新原创文章