Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.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 Spring方面调用接口方法上的自定义注释_Java_Spring_Interface_Annotations_Spring Aop - Fatal编程技术网

Java Spring方面调用接口方法上的自定义注释

Java Spring方面调用接口方法上的自定义注释,java,spring,interface,annotations,spring-aop,Java,Spring,Interface,Annotations,Spring Aop,我有这个界面: public interface FakeTemplate { @CustomAnnotation void foo() { } } @Component public FakeImpl implements FakeTemplate { @Override public void foo() { //Do Stuff } } 这个接口的实现: public interface FakeTemplate

我有这个界面:

public interface FakeTemplate {

    @CustomAnnotation
    void foo() {

    }

}
@Component
public FakeImpl implements FakeTemplate {

    @Override
    public void foo() {
        //Do Stuff
    }

}
这个接口的实现:

public interface FakeTemplate {

    @CustomAnnotation
    void foo() {

    }

}
@Component
public FakeImpl implements FakeTemplate {

    @Override
    public void foo() {
        //Do Stuff
    }

}
在这方面:

@Aspect
@Component
public class CustomAspect {

    @Before(value = "@annotation(com.fake.CustomAnnotation)")
    public void doStuffBefore(JoinPoint joinPoint} {

    }

}
我使用spring启用AspectJ时使用的是:
@enableSpectJautoproxy(proxyTargetClass=true)

我的问题是,在执行FakeImpl的
foo()
方法之前,没有调用aspect
doStuffBefore
方法。当我把
@CustomAnnotation
放在
FakeImpl
上而不是
FakeTemplate
上时,它确实起作用,但我更喜欢把注释放在
FakeTemplate
上,因为它在一个单独的API包中,我有点委托它作为我放置所有注释的地方

我还希望确保在实现
FakeTemplate
的每个类上调用
CustomAnnotation
,而不记得将注释放在所有实现类上


如果注释仅在接口类上,是否有方法获得要调用的通知

注释继承不适用于java中的方法。 但可以使用其他切入点表达式,比如
执行(public*FakeTemplate+.foo(..)
有一种解决方法。在您的示例中,您可以向FaketTemplate接口添加额外的“默认”方法,例如命名为fooFacade的方法,使用@CustomAnnotation对其进行注释,然后委托给“真实”foo方法:

public interface FakeTemplate {

    @CustomAnnotation
    default void fooFacade() {
        foo();
    }

    void foo();
}

现在,无论何时调用fooFacade(),都会触发@CustomAnnotation上的切入点执行。

这是重复的:@RahulSharma,这肯定是相似的,但我不想在方面中指定接口。我希望能够在任何接口上抛出注释,并让注释所在的任何接口的所有实现类运行该建议。我不想不断地向方面添加接口规范。是的,这正是我试图避免的。我希望在多个接口上使用注释,因此我必须不断地向方面添加新接口。我只是将注释添加到实现类中,这样可以使我的方面保持简单,并且在重复工作的同时,对我来说最有意义。把你的答案标记为正确。