Выбор ответа Junior AOP и прокси спрашивают часто обновлено

@Transactional на private-методе

Вопрос

Что произойдёт с @Transactional private void save()?

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

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

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

Коротко

Правильный ответ: Аннотация проигнорируется: прокси не перехватит private. CGLIB-прокси это подкласс, а private-метод подклассу не виден и не переопределяется.

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

  1. Транзакция откроется так же, как для public-метода
  2. Аннотация проигнорируется: прокси не перехватит privateправильный ответ
  3. Ошибка компиляции: аннотация недопустима для private-метода
  4. Spring сделает метод public через рефлексию при старте

Разбор

CGLIB-прокси это подкласс, а private-метод подклассу не виден и не переопределяется. JDK-прокси видит только методы интерфейса. Компилятор не знает семантики аннотации, поэтому ошибки нет, а Spring ничего не меняет в модификаторах. Итог: тихий отказ, который находят только по отсутствию отката.

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

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

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