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-го слоя).
• разницу между `@Before`, `@After` и `@Around` (если дошёл до 2-го слоя).