Выбор ответа Middle AOP и прокси обновлено
final-метод и CGLIB
Вопрос
В сервисе метод public final void pay() помечен @Transactional. Бин проксируется через CGLIB. Что будет?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Транзакции не будет: CGLIB не переопределит final-метод. CGLIB создаёт подкласс и переопределяет методы, final переопределить нельзя.
Варианты ответа
- Транзакция откроется: модификатор final на прокси не влияет
- Spring для этого бина автоматически переключится на JDK-прокси
- Транзакции не будет: CGLIB не переопределит final-методправильный ответ
- Ошибка компиляции: final нельзя сочетать с @Transactional
Разбор
CGLIB создаёт подкласс и переопределяет методы, final переопределить нельзя. Вызов final-метода выполняется на самом объекте-прокси, у которого не внедрены зависимости, поэтому часто вылетает NullPointerException на полях. Автопереключения нет. Если final весь класс, Spring упадёт при старте, не сумев создать подкласс.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.