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

“嵌套”注释的Spring AOP点切割

韦宣
2023-03-14

我需要定义一个切入点,该切入点触发对使用自定义注释注释的spring服务的所有方法的执行。我想要定义切入点的注释将位于其他注释上。

@Y
public @interface X {
}

然后该服务将被注释为以下内容

@X
public Service1 {
} 

我尝试了以下切入点定义,但它仅在@Y位于服务本身时有效,这意味着它看不到注释位于@X上

@Around("@within(com.mypackage.Y)")

共有2个答案

司空宗清
2023-03-14

这不是Spring或AspectJ问题。在Java中,接口、其他注释或方法上的注释永远不会通过实现类、使用注释或重写方法的类来继承。注释继承仅适用于从类到子类的情况,但前提是超类中使用的注释类型具有继承的元注释。

更新:因为我之前已经多次回答过这个问题,所以我刚刚记录了这个问题以及使用AeyJ的接口和方法的模拟注释继承中的解决方法。

这里有一点证明你想要的东西不起作用,因此也不能被一个方面利用:

package de.scrum_master.app;

import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface OuterAnnotation {}
package de.scrum_master.app;

import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@OuterAnnotation
public @interface InnerAnnotation {}
package de.scrum_master.app;

import java.lang.annotation.Annotation;

@InnerAnnotation
public class Application {
    public static void main(String[] args) {
        for (Annotation annotation : Application.class.getAnnotations())
            System.out.println(annotation);
    }
}

控制台输出显示,JVM只能看到内部注释,而不能看到内部注释上使用的外部注释:

@de.scrum_master.app.InnerAnnotation()

更新:Bradley M Handy的回答引起了我的兴趣,我重新检查了它是否也适用于我的代码中描述的情况,确实如此。这种类型的AspectJ语法对我来说是未知的,尽管我认为我对AspectJ了解很多。谢谢你,布拉德利.:-)这方面将起作用:

package de.scrum_master.aspect;

import de.scrum_master.app.OuterAnnotation;

public aspect MetaAnnotationAspect {
  after() : within(@(@OuterAnnotation *) *) && execution(* *(..)) {
    System.out.println(thisJoinPoint);
  }
}

运行应用程序时的控制台日志:

@de.scrum_master.app.InnerAnnotation()
execution(void de.scrum_master.app.Application.main(String[]))
解河
2023-03-14

我在一个应用程序中有这个确切的需求。我找到了这个答案,但不满意这不能做到。

在进一步搜索之后,我找到了这个AspectJ/Spring切入点表达式的备忘单。备忘单中的解决方案并没有完全像广告中宣传的那样有效,但我能够使它满足我的需要。

@Pointcut("within(@(@Annotation *) *)")
public void classAnnotatedWithNestedAnnotationOneLevelDeep() { }

我将此表达式与@in表达式相结合,仅用于@Annoation以获得我想要的工作。

对于方法执行:

@Pointcut("execution(@(@com.someorg.SomeAnnotation *) * *(..))")
public void methodAnnotatedWithNestedAnnotationOneLevelDeep() { }

我将这个表达式与一个注释表达式相结合,仅用于注释,以获得我想要用于方法的内容。

 类似资料:
  • 问题内容: 我需要定义一个切入点,该切入点触发使用自定义注释注释的spring服务的所有方法的执行。我想定义切入点的注释将在另一个注释上。 然后该服务将被注释如下 我尝试使用以下切入点定义,但是仅当@Y在服务本身上时才有效,这意味着它看不到注释在@X上 问题答案: 我在应用程序中有这个确切的需求。我找到了这个答案,但不满意无法完成。 经过更多搜索之后,我发现了用于AspectJ / Spring切

  • 我试图在方法注释上创建一个Aeyj切入点,但我总是用不同的方法失败。我使用的是aspectj自动代理(我在Spring上下文中没有配置其他编织)。我的类如下所示: 所以我想知道为什么aspectj不会创建切入点。我设法使用执行(**(…)使其工作抛出一些exc)这对我来说很好,但我仍然想知道我做错了什么。 另外,由于是在接口中定义的,我指定了实现类的注释,有没有办法让它以这种方式工作?其他代理机制

  • 问题内容: 我在论坛上进行了搜索,但没有得到权威的答案。我想以这种方式实现嵌套的注释结构: 我的表的转储如下: 我知道如何使用和循环。PHP和MySQL的新手。请帮帮我。 问题答案: 我在博客文章中做了类似的事情。但是,我只是尝试了相同的数据。当您说 嵌套注释时 ,最好以这种方式使用 嵌套函数 : 为此,我已将您的数据导入MySQL并尝试了以下操作: 就像我之前说过的那样,我使用了嵌套函数,并且正

  • 我不能用“”运算符和多个注释来做切入点。我试图为一些JBehave注释创建一个切入点(@givid、@then、@when)。 为这三个注释创建切入点的语法是什么?因为我在其他切入点中使用了逻辑OR运算符,所以我假设它类似于: 但是它不起作用,我得到一个不一致的绑定异常。我尝试了其他组合,但找不到一个这样做的诀窍。

  • 对于用@X注释的类中的方法或用@X注释的方法,我需要一个切入点。我还需要注释对象。如果类和方法都被注释,我更喜欢将方法注释作为参数。 我尝试了以下操作,这会产生“绑定不一致”的警告。(为什么不直接将其设置为null?) 以下内容创建了“穿过切入点中的“||”的参数x的不明确绑定”警告。(在我看来,这不一定有意义:为什么不绑定第一个短路评估?) 如果存在类和方法注释,则将前面的尝试拆分为两个,自然会

  • 我正在使用Spring AOP进行日志记录。我想创建一个切入点,该切入点适用于除具有特定注释的方法外的所有方法,但我不知道如何进行。我所发现的只是如何包含带有注释的方法。