Вопрос с собеседования · Spring

Какие ограничения есть у Spring AOP из-за того, что он основан на прокси?

MiddleAOP и проксиSpring
Ещё спрашивают так:
  • Почему аспект не срабатывает?
Коротко

Spring AOP на прокси перехватывает только внешние вызовы публичных методов бинов: не работает self-invocation, private-методы, final-методы и классы при CGLIB, объекты не из контейнера, поля.

  • this.method() идёт мимо прокси
  • @PostConstruct вызывается до появления прокси
  • AspectJ weaving снимает ограничения, но усложняет сборку

А ещё Проверить, что бин — прокси: AopUtils.isAopProxy(bean)

Подробно

Spring AOP поддерживает единственный вид точки соединения — выполнение метода, поэтому доступ к полям и вызовы конструкторов не перехватываются: для этого нужен полноценный AspectJ с плетением байткода. Отсюда же вытекает большинство вопросов «почему не работает @Transactional»: вызвали метод изнутри класса, объявили его private, или класс оказался final. Практические обходы: вынести метод в отдельный бин, внедрить в себя ссылку на прокси через ObjectProvider или использовать AopContext.currentProxy(), а в крайнем случае перейти на AspectJ. Первый вариант почти всегда лучше — необходимость самовызова обычно означает, что в классе смешаны две ответственности.

Что хотят услышать

  • Перечень ограничений и причина.
  • Как обойти.

Частые ошибки

  • Ставить @Transactional на private-метод и ждать транзакции.
  • Пытаться перехватить доступ к полю средствами Spring AOP.

Проверьте себя

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Вызов метода изнутри того же объекта проходит мимо аспекта
  • ✓Private-методы перехватить нельзя
  • ✓CGLIB не проксирует final-классы и final-методы
  • ✗Точками среза могут быть обращения к полям объекта, как в полноценном AspectJ с weaving

Что спросят дальше

  • Как правильно обойти проблему self-invocation?
  • Чем плетение AspectJ отличается от прокси?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования