К чему приводит использование Pointcut с выражением *.* в Spring AOP?

«К чему приводит использование Pointcut с выражением *.* в Spring AOP?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Использование выражения Pointcut *.* (или execution(* *.*(..))) приведет к сопоставлению с любым методом любого класса, включая приватные, статические методы и даже методы системных библиотек (например, JDK или Spring Framework). Это считается критической ошибкой и приводит к:

  1. Катастрофическому падению производительности: Фреймворк будет пытаться создать AOP-прокси для каждого вызова метода в JVM, что делает приложение непригодным для использования.
  2. Неопределенному и неожиданному поведению: Advice может срабатывать в непредусмотренных местах (внутри контейнера Spring, при вызовах toString(), hashCode() и т.д.), что ломает логику работы.
  3. Невозможности отладки: Из-за тотального перехвата вызовов логирование и трассировка становятся бесполезными.

Пример опасного аспекта (никогда не используйте):

@Aspect
@Component
public class DangerousAspect {
    @Before("execution(* *.*(..))") // Перехватывает ВСЁ
    public void logEverything() {
        System.out.println("Advice executed!");
    }
}

Решение: Всегда ограничивайте Pointcut максимально конкретными пакетами, классами или методами.

@Before("execution(public * com.example.service.*.*(..))")
@Before("@annotation(org.springframework.transaction.annotation.Transactional)")