Логирование времени выполнения методов с помощью аннотаций (AspectJ)

f2a68e1e1a8d628facb3bf52604cbf6b

Сразу оговорюсь:

  1. Spring AOP не подходит для этой цели потому что:

    1. будет работать только на public методах

    2. ввиду особенностей реализации не будет работать в методе вызванном из другого метода этого же сервиса.

  2. материал небольшой для статьи потому что:

    1. я так люблю излагать

    2. в том же объеме это не влезает в пост

Зависимости


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

Вешать аннотацию можно на методах с любой видимостью. Взято из работающего кода.

© Habrahabr.ru