Ответ
Точка среза (Pointcut) в Spring AOP — это предикат (выражение), который определяет набор Join Points (точек соединения, например, вызовов методов), к которым должен быть применён совет (Advice) из аспекта. Это механизм указания «где» в коде должен сработать аспект.
Основные компоненты:
- Pointcut Expression: Выражение, написанное на языке AspectJ, которое описывает шаблон совпадения.
- Pointcut Designator (PCD): Ключевое слово, определяющее тип совпадения.
Распространённые PCD с примерами:
// 1. execution — самый частый, для совпадения по выполнению метода
@Pointcut("execution(public * com.example.service.*.*(..))")
public void servicePublicMethods() {}
// Совпадёт с любым публичным методом любого класса в пакете service
// 2. within — ограничение по типам (класс/пакет)
@Pointcut("within(com.example.controller..*)")
public void inControllerLayer() {}
// Все Join Points внутри любого класса в пакете controller и его подпакетах
// 3. @annotation — совпадение по наличию аннотации у метода
@Pointcut("@annotation(org.springframework.transaction.annotation.Transactional)")
public void transactionalMethod() {}
// Все методы, аннотированные @Transactional
// 4. args — совпадение по аргументам метода
@Pointcut("execution(* *..*.find*(..)) && args(id)")
public void findMethodsWithLongArg(Long id) {}
// Методы, имя которых начинается с 'find' и первый аргумент типа Long
Комбинирование и логика:
Точки среза можно комбинировать с помощью логических операторов && (and), || (or), ! (not).
@Pointcut("servicePublicMethods() && !inControllerLayer()")
public void publicServiceMethodsOutsideControllers() {}
Почему это важно: Pointcut отделяет описание логики аспекта (Advice) от описания мест её применения, что делает аспекты модульными и пригодными для повторного использования.