Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于'的弹簧AOP点切割;嵌套';注释_Java_Spring_Annotations_Aspectj_Spring Aop - Fatal编程技术网

Java 用于'的弹簧AOP点切割;嵌套';注释

Java 用于'的弹簧AOP点切割;嵌套';注释,java,spring,annotations,aspectj,spring-aop,Java,Spring,Annotations,Aspectj,Spring Aop,我需要定义一个切入点,该切入点触发对带有自定义注释的spring服务的所有方法的执行。我要定义切入点的注释将位于其他注释上 @Y public @interface X { } 然后服务将被注释如下 @X public Service1 { } 我尝试了下面的切入点定义,但它只在@Y位于服务本身时起作用,这意味着它看不到注释位于@X上 @Around("@within(com.mypackage.Y)") 这不是Spring或AspectJ的问题。在Java中,接口上的注释、其他注释或方

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

@Y
public @interface X {
}
然后服务将被注释如下

@X
public Service1 {
} 
我尝试了下面的切入点定义,但它只在@Y位于服务本身时起作用,这意味着它看不到注释位于@X上

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

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

更新:因为我以前已经回答过好几次这个问题,所以我刚刚记录了这个问题,以及中的解决方法

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

package de.scrum\u master.app;
导入java.lang.annotation.Inherited;
导入java.lang.annotation.Retention;
导入java.lang.annotation.RetentionPolicy;
@继承的
@保留(RetentionPolicy.RUNTIME)
public@interface外层表示法{}
package de.scrum\u master.app;
导入java.lang.annotation.Inherited;
导入java.lang.annotation.Retention;
导入java.lang.annotation.RetentionPolicy;
@继承的
@保留(RetentionPolicy.RUNTIME)
@外层符号
public@interface InnerAnnotation{}
package de.scrum\u master.app;
导入java.lang.annotation.annotation;
@内部注释
公共类应用程序{
公共静态void main(字符串[]args){
for(注释:Application.class.getAnnotations())
System.out.println(注释);
}
}
控制台输出显示JVM只看到内部注释,而不是内部注释上使用的外部注释:

@de.scrum\u master.app.InnerAnnotation()

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

package de.scrum\u master.aspect;
导入de.scrum_master.app.OuterAnnotation;
公共方面元注释方面{
after():在(@(@OuterAnnotation*)内和执行(**(..){
System.out.println(此连接点);
}
}
运行应用程序时的控制台日志:

@de.scrum\u master.app.InnerAnnotation()
执行(void de.scrum_master.app.Application.main(String[]))

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

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

@Pointcut("within(@(@Annotation *) *)")
public void classAnnotatedWithNestedAnnotationOneLevelDeep() { }
我将这个表达式与表达式中的一个@相结合,只为@注释获得我想要的工作

对于方法执行:

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

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

请看,我已尝试将\@within替换为\@annotation,但这也不起作用。这就好像注释只是在aspectj上看不见,因为它在X注释上不知何故,我完全错了你的问题。抱歉:(酷,老兄!你是对的,我刚刚根据你说的更新了我的答案。虽然我说注释不是继承的是正确的,但实际上AspectJ可以使用你在这里描述的语法间接推断它们。我不再经常了解AspectJ的新内容,但现在我已经知道了。