Выбор ответа Middle Бины: скоупы и жизненный цикл обновлено

@Transactional из @PostConstruct

Вопрос

В @PostConstruct-методе бина вызывается его же метод loadCache(), помеченный @Transactional. Будет ли транзакция?

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

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

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

Коротко

Правильный ответ: Нет: вызов через this, а прокси ещё не создан. @PostConstruct выполняется до postProcessAfterInitialization, где создаются прокси, и вызывается на самом объекте.

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

  1. Да: @PostConstruct вызывается уже после создания прокси
  2. Да, но только с readOnly = true на время инициализации
  3. Нет, и контекст не стартует с ошибкой транзакции
  4. Нет: вызов через this, а прокси ещё не созданправильный ответ

Разбор

@PostConstruct выполняется до postProcessAfterInitialization, где создаются прокси, и вызывается на самом объекте. Вызов через this в любом случае не проходит через прокси. Ошибки при старте не будет, транзакции просто нет. Решение: выполнять такую загрузку в обработчике ApplicationReadyEvent через внедрённый бин или через TransactionTemplate.

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

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