Карта / Spring AOP / Aspect, Advice, Pointcut

Aspect, Advice, Pointcut

Три ключевых термина AOP: где вмешаться, что сделать, и кто это всё описывает.

@Aspect                                   // класс, описывающий сквозную логику
@Component
class LoggingAspect {

    @Around("execution(* ru.javaguide.service.*.*(..))")   // Pointcut: к каким методам применить
    Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {   // Advice: что делать
        long start = System.currentTimeMillis();
        Object result = joinPoint.proceed();   // вызвать реальный метод
        log.info("{} выполнен за {}мс", joinPoint.getSignature(), System.currentTimeMillis() - start);
        return result;
    }
}
  • Aspect — класс, в котором собрана сквозная логика;
  • Pointcut — выражение, описывающее к каким методам применить (в примере: все методы всех классов в пакете service);
  • Advice — сам код, который выполняется (в примере: замер времени вокруг вызова метода).
Копнуть глубже

Виды Advice — когда именно выполняется код относительно вызова метода:

AdviceКогда срабатывает
@Beforeдо вызова метода
@Afterпосле, независимо от результата (как finally)
@AfterReturningпосле успешного завершения
@AfterThrowingесли метод бросил исключение
@Aroundоборачивает весь вызов — самый гибкий, может изменить результат или вообще не вызвать метод

Pointcut-выражения строятся по синтаксису AspectJ:

@Before("execution(* ru.javaguide.service.UserService.*(..))")   // все методы конкретного класса
@Before("@annotation(ru.javaguide.LogExecutionTime)")              // методы с конкретной аннотацией

Второй вариант — частая практика: создаёшь свою аннотацию @LogExecutionTime и вешаешь только на нужные методы, вместо широкого выражения по имени пакета — точнее контролируешь, где именно применяется логика аспекта.

🎤 Закрыл тему, если можешь объяснить:
• роли Aspect, Pointcut и Advice;
• разницу между `@Before`, `@After` и `@Around` (если дошёл до 2-го слоя).