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

Request-бин в singleton

Вопрос

Как singleton-сервис получает правильный request-скоуп бин RequestContext для каждого запроса?

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

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

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

Коротко

Правильный ответ: Через scoped proxy, который достаёт бин текущего запроса. Request-бин живёт меньше синглтона, поэтому в синглтон внедряется прокси (proxyMode = ScopedProxyMode.TARGETCLASS, у @RequestScope это по умолчанию).

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

  1. Spring пересоздаёт singleton-сервис на каждый HTTP-запрос
  2. Spring внедряет request-бин заново перед каждым вызовом метода
  3. Никак: request-бины нельзя использовать из синглтонов
  4. Через scoped proxy, который достаёт бин текущего запросаправильный ответ

Разбор

Request-бин живёт меньше синглтона, поэтому в синглтон внедряется прокси (proxyMode = ScopedProxyMode.TARGET_CLASS, у @RequestScope это по умолчанию). При вызове метода прокси находит экземпляр, привязанный к текущему запросу через RequestContextHolder. Синглтоны не пересоздаются и повторного внедрения нет. Вне веб-запроса такой прокси бросит исключение.

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

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