Ответ
Использование выражения Pointcut *.* (или execution(* *.*(..))) приведет к сопоставлению с любым методом любого класса, включая приватные, статические методы и даже методы системных библиотек (например, JDK или Spring Framework). Это считается критической ошибкой и приводит к:
- Катастрофическому падению производительности: Фреймворк будет пытаться создать AOP-прокси для каждого вызова метода в JVM, что делает приложение непригодным для использования.
- Неопределенному и неожиданному поведению: Advice может срабатывать в непредусмотренных местах (внутри контейнера Spring, при вызовах
toString(),hashCode()и т.д.), что ломает логику работы. - Невозможности отладки: Из-за тотального перехвата вызовов логирование и трассировка становятся бесполезными.
Пример опасного аспекта (никогда не используйте):
@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)")