Perf4j не профилирует метод аннотированного интерфейса

У меня есть следующий интерфейс и класс

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?


person FourOfAKind    schedule 11.02.2013    source источник


Ответы (1)


Даже если бы @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 полезен только в том случае, если вы используете его с его атрибутами tag и message (которые, я полагаю, различаются в каждом классе реализации).

http://perf4j.codehaus.org/devguide.html#Adding_the_Profiled_Annotation_to_Method_Declarations -> "@ Профилированный (тег = "dynamicTag_{$0}")"

person Marcel Stör    schedule 11.02.2013