这个执行切入点表达式是如何工作的? [英] How does this execution pointcut expression work?
问题描述
我遇到一个来自@kriegaex的answer,我无法理解。
我试图理解的切入点表达式如下
@Around("execution(* (@MyAnnotation *).*(..)) || execution(@MyAnnotation * *(..))")
据我所知,此表达式将建议使用@MyAnnotation
从reference documentation开始,execution
表达式的格式如下:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern)
throws-pattern?)
基于此格式,以下表达式
execution(* (@MyAnnotation *).*(..))
可以解释为
ret-type-pattern is *
declaring-type-pattern is any type with @MyAnnotation
name-pattern is *
param-pattern is ..
建议使用@MyAnnotation
注释的类中的任何方法调用。如果我错了,请纠正我。
和此表达式
execution(@MyAnnotation * *(..))
我无法理解modifiers-pattern
如何可以是@MyAnnotation
?这是如何工作的?
推荐答案
这是一个有趣的问题。有人正在阅读文档,哇!:)
Spring网站上的语法描述摘自AspectJ Programming Guide,它还指向AspectJ Programming Guide。虽然定义仍然有效,但编程指南是在Java 5之前的时代编写的,也就是很久以前,从那时起,IMO就没有更新过。您可能注意到,它甚至根本没有提到批注。
所有与注释相关的内容都写在所谓的The AspectJ 5 Development Kit Developer's Notebook中,其中有一小段提到:
每个连接点都有一组修饰符--包括
public
、private
、static
、abstract
等标准Java修饰符、任何注释以及方法和构造函数的throws
子句。这些修饰语是连接点的主题的修饰语。
所以For AspectJ方法或类注释是它们的修饰符组的一部分,正如您已经正确地注意到的。
更新:您可能需要考虑投资Ramnivas Laddad的"AspectJ in Action"这本书。它也很旧(2009年的第二版),但以可靠的方式涵盖了AspectJ和Spring AOP的基础。这是一张截图,我希望兰尼瓦斯和/或出版商不要为此起诉我。这是为了激励人们购买这本书:
更新2:现在,整本图书甚至可以免费read online。例如,屏幕截图中的章节是here。
这篇关于这个执行切入点表达式是如何工作的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!