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}")"