Что такое точка среза (Pointcut) в Spring AOP?

Ответ

Точка среза (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) от описания мест её применения, что делает аспекты модульными и пригодными для повторного использования.

Ответ 18+ 🔞

О, слушай, смотри, это ж про ту самую хуйню в Spring AOP — про точку среза (Pointcut). Представь себе, что ты — охотник, а твой аспект — это патрон с волшебной хуйнёй. Так вот, pointcut — это твой прицел, блядь! Он говорит патрону: «Стреляй не абы куда, а вот в эти конкретные жопы в коде».

Это такая хитрая штука, которая тычет пальцем и орет: «Ёпта, вот тут! Вот в этом методе! Или во всех методах этого класса! Вот где наша магия должна впендюриться!».

Из чего состоит эта пиздопроебищна:

  • Pointcut Expression: Это как заклинание, написанное на языке этих, блядь, АспектЖэев. Набор слов, который описывает шаблон.
  • 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() {}
// «Всех, кто живёт в контроллерах (и их детей в подпакетах), на кол!»

// 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. Вот этих и вали!»

А ещё их можно скрещивать, как грешных хомячков! Используешь && (и), || (или), ! (не, хуй тебе). Получается мощно.

@Pointcut("servicePublicMethods() && !inControllerLayer()")
public void publicServiceMethodsOutsideControllers() {}
// «Дайте мне все публичные сервисные методы, но, блядь, только НЕ из контроллеров! Чтоб духу их тут не было!»

А в чём, собственно, соль-то, блядь? А соль в том, что pointcut — это гениальное разделение, ёпта! Одна часть (совет) говорит «что делать», а pointcut — «где делать». Получается аспект — не привязанная намертво к одной жопе хрень, а такая модульная, переиспользуемая пакость. Красота, в рот меня чих-пых!