Вопрос проверяет практическое понимание Spring AOP и умение писать аспекты.
Для измерения времени используется аспект с @Around.
Время фиксируется до и после proceed().
Аспект может применяться по аннотации или по пакету.
Код изолирован от бизнес-логики.
Подход легко расширяется.
Рассмотрим типовую реализацию такого аспекта.
Создаём маркерную аннотацию:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {}
@Aspect
@Component
public class TimingAspect {
@Around("@annotation(LogExecutionTime)")
public Object measure(ProceedingJoinPoint pjp) throws Throwable {
long start = System.nanoTime();
try {
return pjp.proceed();
} finally {
long duration = System.nanoTime() - start;
// логирование duration
}
}
}
@LogExecutionTime
public void process() {
// бизнес-логика
}
аспект работает только для Spring-бинов
самовызовы не перехватываются
важно учитывать накладные расходы
Аспекты позволяют прозрачно измерять время выполнения методов без загрязнения бизнес-кода.