Логирование времени выполнения методов с помощью аннотаций (AspectJ)
Сразу оговорюсь:
Spring AOP не подходит для этой цели потому что:
будет работать только на public методах
ввиду особенностей реализации не будет работать в методе вызванном из другого метода этого же сервиса.
материал небольшой для статьи потому что:
я так люблю излагать
в том же объеме это не влезает в пост
Зависимости
org.aspectj
aspectjrt
1.9.21
org.codehaus.mojo
aspectj-maven-plugin
1.15.0
Плагин maven
org.codehaus.mojo
aspectj-maven-plugin
1.15.0
11.0
11.0
true
true
ignore
UTF-8
true
${project.build.directory}/classes
compile
...
Аннотация
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogTime {
}
Создаем аспект
@Aspect
@Slf4j
public class LogTimeAspect {
@Pointcut("@annotation(org.mypackage.subpackage.LogTime) && execution(* *(..))")
public void callAtLogExecuting() { }
@Around("callAtLogExecuting()")
public Object aroundCallAt(final ProceedingJoinPoint pjp) throws Throwable {
var startTime = System.currentTimeMillis();
Object retVal = pjp.proceed();
var elapsedTime = System.currentTimeMillis() - startTime;
log.debug(pjp.getSignature().getName() + " elapsed " + elapsedTime);
return retVal;
}
}
Используем аннотацию
@LogTime
private yourMethod() {
// method body
}
Вешать аннотацию можно на методах с любой видимостью. Взято из работающего кода.