Выбор ответа Middle Бины: скоупы и жизненный цикл обновлено
@Transactional из @PostConstruct
Вопрос
В @PostConstruct-методе бина вызывается его же метод loadCache(), помеченный @Transactional. Будет ли транзакция?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Нет: вызов через this, а прокси ещё не создан. @PostConstruct выполняется до postProcessAfterInitialization, где создаются прокси, и вызывается на самом объекте.
Варианты ответа
- Да: @PostConstruct вызывается уже после создания прокси
- Да, но только с readOnly = true на время инициализации
- Нет, и контекст не стартует с ошибкой транзакции
- Нет: вызов через this, а прокси ещё не созданправильный ответ
Разбор
@PostConstruct выполняется до postProcessAfterInitialization, где создаются прокси, и вызывается на самом объекте. Вызов через this в любом случае не проходит через прокси. Ошибки при старте не будет, транзакции просто нет. Решение: выполнять такую загрузку в обработчике ApplicationReadyEvent через внедрённый бин или через TransactionTemplate.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.