当前位置: 首页 > 知识库问答 >
问题:

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

柴彬
2023-03-14

我从@kriegaex那里得到了一个答案,我无法理解。

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

@Around("execution(* (@MyAnnotation *).*(..)) || execution(@MyAnnotation * *(..))")

据我所知,此表达式将建议使用MyAnnotation注释的任何类或方法

从引用留档中,执行表达式的格式如下:

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 ..

建议使用@MyAnnoation注释的类中的任何方法调用。如果我错了,请纠正我。

对于这个表达式

execution(@MyAnnotation * *(..))

我无法理解修饰符模式如何可以是MyAnnotation?这是怎么回事?

共有1个答案

阎祖鹤
2023-03-14

那是个有趣的问题有人在看留档,哇!:)

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

Spring网站上的语法描述取自它也指向的AeyJ编程指南。虽然定义仍然有效,但编程指南是在Java5之前的时代编写的,也就是说很久以前,从那以后IMO就没有更新过。你可能会注意到它甚至根本没有提到注释。

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

每个连接点都有一组修饰符——这些修饰符包括标准的Java修饰符,如public私有静态抽象等。任何注释,以及方法和构造函数的抛出子句。这些修饰符是连接点主题的修饰符。

因此,对于AeyJ,方法或类注释是它们的修饰符组的一部分,正如您已经正确指出的那样。

更新:你可能想投资RamnivasLaddad的《AspectJ在行动中》一书。它也很旧(2009年第2版),但以坚实的方式涵盖了AspectJ和Spring AOP的基础知识。这是一个截图,我希望拉姆尼瓦斯和/或出版商不要因此起诉我。这是为了激励人们购买这本书:

更新2:看起来现在整本书甚至可以免费在线阅读。例如,屏幕截图中的章节就在这里。

 类似资料:
  • 我在我的Scala项目中使用带有sbt-aspectj的AeyJ库。我正在尝试使用表达式编写: 但我有以下例外: 以下AspectJ教程介绍: 因此,通过注释样式,可以仅在@pointcut表达式中使用if()切入点。if()不能包含任何正文。然后,带注释的@切入点方法必须是公共静态布尔的形式,并且可以像往常一样使用形式绑定 可以在Scala方法上使用切入点中的if()表达式吗?

  • 我使用的是Spring security 3.2.0和Spring框架的相同版本。Spring security在我的项目中工作得很好。为了保护DAO类(和其他类)中的方法,我希望使用以下切入点方法(在文件中)。 我希望指定的pointcut表达式能够保护包内所有类中的所有方法,并且只能由具有指定权限的用户访问。

  • 我有以下切入点表达式:

  • 我有一个类似这样的类: null 多谢. 注意:可以有没有管理员的用户,也可以有没有用户的管理员。

  • 这是来自SQLZOO.NET的问题

  • 正则表达式如何匹配出这个字符串'calc(100vh - 420px)'中的数字420