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?

1 ответ

Решение

Даже если @Profiled используемый @Inherit это не сработает, потому что унаследованные аннотации только когда-либо передаются в подклассы, а не в реализации интерфейсов.

@ Наследуемые аннотации не наследуются, когда используются для аннотирования чего-либо, кроме типа. Тип, который реализует один или несколько интерфейсов, никогда не наследует аннотации от интерфейсов, которые он реализует.

Источник: http://www.eclipse.org/aspectj/doc/released/adk15notebook/annotations.html

Более подробная информация: http://www.jroller.com/melix/entry/the_truth_about_annotations_inheritance

Что бы сделал ваш пользовательский процессор, запросите интерфейс сервиса для @Profiled? Я предлагаю вам вручную аннотировать реализации службы, потому что по моему опыту @Profiled полезно только если вы используете его с его tag а также message атрибуты (которые различаются в каждом реализующем классе, я полагаю).

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

Другие вопросы по тегам