Получить доступ

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

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

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

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

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

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем