Выбор ответа Middle AOP и прокси обновлено

final-метод и CGLIB

Вопрос

В сервисе метод public final void pay() помечен @Transactional. Бин проксируется через CGLIB. Что будет?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Транзакции не будет: CGLIB не переопределит final-метод. CGLIB создаёт подкласс и переопределяет методы, final переопределить нельзя.

Варианты ответа

  1. Транзакция откроется: модификатор final на прокси не влияет
  2. Spring для этого бина автоматически переключится на JDK-прокси
  3. Транзакции не будет: CGLIB не переопределит final-методправильный ответ
  4. Ошибка компиляции: final нельзя сочетать с @Transactional

Разбор

CGLIB создаёт подкласс и переопределяет методы, final переопределить нельзя. Вызов final-метода выполняется на самом объекте-прокси, у которого не внедрены зависимости, поэтому часто вылетает NullPointerException на полях. Автопереключения нет. Если final весь класс, Spring упадёт при старте, не сумев создать подкласс.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме