0

我有以下接口和类

public interface ServiceA {

    @Profiled
    String getString();
}

public class ServiceAImpl implements ServiceA{
    String getString(){
      System.out.println("getString");
    }

}

<beans ....>    
    <aop:aspectj-autoproxy />
     <bean id="timingAspect" class="org.perf4j.log4j.aop.TimingAspect"/>"
     <bean id="serviceA" class="com.naresh.profiler.service.ServiceAImpl" />
</beans>

当我这样做时serviceA.getString(),TimingAspect 没有拦截到呼叫。如果我将注释从接口移动到实现类,它会被拦截。我看到的原因是方法级别的注释没有被继承。如何解决这个问题?通过写一些CustomBeanAnnotationProcessor?

4

1 回答 1

0

即使@Profiled使用@Inherit它也不起作用,因为继承的注释只会传递给子类而不是接口的实现。

@Inherited 注释在用于注释类型以外的任何内容时不会被继承。实现一个或多个接口的类型永远不会从它实现的接口继承任何注释。

资料来源: http: //www.eclipse.org/aspectj/doc/released/adk15notebook/annotations.html#annotation-inheritance

更多细节:http ://www.jroller.com/melix/entry/the_truth_about_annotations_inheritance

您的自定义处理器会做什么,查询服务的接口@Profiled?我建议您手动注释服务实现,因为根据我的经验@Profiled,仅当您将其与它的tagmessage属性一起使用时才有帮助(我想在每个实现类中都不同)。

http://perf4j.codehaus.org/devguide.html#Adding_the_Profiled_Annotation_to_Method_Declarations -> "@Profiled(tag = "dynamicTag_{$0}")"

于 2013-02-11T22:40:22.667 回答