Я создал простую Aspect аннотацию для измерения времени выполнения аннотированного метода. Когда я аннотирую метод простого Spring Bean, внедряю bean-компонент и запускаю его как bean.annotatedMethod()
, все работает нормально.
Однако, когда я аннотирую метод convert()
в Spring Converter, аннотация игнорируется. Я предполагаю, что причина в том, что convert()
вызывается внутри Spring ConversionService, и почему-то аспекты не соблюдаются. Есть ли способ заставить его работать?
Аннотация:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogExecTime {
}
Аспект, который я регистрирую весной:
@Aspect
@Component
public class LogTimeAspect {
@Around(value = "@annotation(annotation)")
public Object LogExecutionTime(final ProceedingJoinPoint joinPoint, final LogExecTime annotation) throws Throwable {
final long startMillis = System.currentTimeMillis();
try {
System.out.println("Starting timed operation");
final Object retVal = joinPoint.proceed();
return retVal;
} finally {
final long duration = System.currentTimeMillis() - startMillis;
System.out.println("Call to " + joinPoint.getSignature() + " took " + duration + " ms");
}
}
}
Это отлично работает:
@Component
public class Operator {
@LogExecTime
public void operate() throws InterruptedException {
System.out.println("Performing operation");
Thread.sleep(1000);
}
}
@Bean
protected Void test(Operator o) {
o.operate();
return null;
}
Но здесь аннотация игнорируется:
public class SampleConverter implements Converter<SourceType, ResultType> {
@Override
@LogExecTime
public ImmutableData convert(@Nonnull ClassifiedEvent result) {
...
}
}
ConversionService conversionService;
...
conversionService.convert(source, ResultType.class));