这个执行切入点表达式是如何工作的?切入点、表达式、工作

2023-09-03 14:35:59 作者:得不到的永远矜贵

我遇到一个来自@kriegaex的answer,我无法理解。

我试图理解的切入点表达式如下

@Around("execution(* (@MyAnnotation *).*(..)) || execution(@MyAnnotation * *(..))")
Spring Spring MVC MyBatis SSM

据我所知,此表达式将建议使用@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?这是如何工作的?

推荐答案

这是一个有趣的问题。有人正在阅读文档,哇!:)

文档维护在AspectJ中是一个问题,因为现在的开发主要是由Andrew(Andy)Clement一个人表演。他主要忙于跟上Java发布周期和新的语言特性,例如,已经发布了支持Java 14的开发人员版本(记录类)。

Spring网站上的语法描述摘自AspectJ Programming Guide,它还指向AspectJ Programming Guide。虽然定义仍然有效,但编程指南是在Java 5之前的时代编写的,也就是很久以前,从那时起,IMO就没有更新过。您可能注意到,它甚至根本没有提到批注。

所有与注释相关的内容都写在所谓的The AspectJ 5 Development Kit Developer's Notebook中,其中有一小段提到:

每个连接点都有一组修饰符--包括publicprivatestaticabstract等标准Java修饰符、任何注释以及方法和构造函数的throws子句。这些修饰语是连接点的主题的修饰语。

所以For AspectJ方法或类注释是它们的修饰符组的一部分,正如您已经正确地注意到的。

更新:您可能需要考虑投资Ramnivas Laddad的"AspectJ in Action"这本书。它也很旧(2009年的第二版),但以可靠的方式涵盖了AspectJ和Spring AOP的基础。这是一张截图,我希望兰尼瓦斯和/或出版商不要为此起诉我。这是为了激励人们购买这本书:

更新2:现在,整本图书甚至可以免费read online。例如,屏幕截图中的章节是here。