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

Spring оборачивает бины в прокси, чтобы работали @Transactional и @Cacheable. Какие практические следствия из этого вытекают?

MiddleПаттерны проектированияSpring
Коротко

Прокси перехватывает только внешние вызовы: this.method() внутри класса идёт мимо прокси — аннотация не сработает. CGLIB не проксирует final-классы и final-методы, JDK-прокси требует интерфейс. Приватные методы не перехватываются.

  • Решение self-invocation — вынести метод в другой бин или внедрить самого себя
  • Spring Boot по умолчанию использует CGLIB
  • Перехват только public-методов (в новых версиях — и protected у CGLIB)

А ещё Прокси не видно в equals и getClass — сравнения могут удивить

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

Подробно

Прокси перехватывает только внешние вызовы, проходящие через ссылку на него. Вызов this.method() внутри класса идёт напрямую — отсюда классическая ловушка с @Transactional при self-invocation. Реализаций две: JDK dynamic proxy (нужен интерфейс) и CGLIB (наследование, поэтому final-классы и final-методы не проксируются). Смена интерфейса — признак адаптера, а не прокси.

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

  • Self-invocation.
  • Ограничения CGLIB и JDK-прокси.

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

  • Искать причину неработающего @Transactional в конфигурации, а не в self-invocation.
  • Думать, что прокси меняет контракт бина.

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

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

Показать варианты и ответ
  • ✓Вызов аннотированного метода изнутри того же класса идёт мимо прокси, и аннотация не срабатывает
  • ✓CGLIB-прокси не может проксировать final-классы и final-методы
  • ✓JDK-прокси требует, чтобы у бина был интерфейс
  • ✗Прокси меняет интерфейс бина, поэтому клиентам нужно приведение типа

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

  • Как обойти проблему self-invocation?
  • Чем прокси Hibernate для ленивых ассоциаций похож на этот механизм?

Разбор темы

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

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

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

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

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