Выбор ответа Senior Бины: скоупы и жизненный цикл обновлено
Request-бин в singleton
Вопрос
Как singleton-сервис получает правильный request-скоуп бин RequestContext для каждого запроса?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Через scoped proxy, который достаёт бин текущего запроса. Request-бин живёт меньше синглтона, поэтому в синглтон внедряется прокси (proxyMode = ScopedProxyMode.TARGETCLASS, у @RequestScope это по умолчанию).
Варианты ответа
- Spring пересоздаёт singleton-сервис на каждый HTTP-запрос
- Spring внедряет request-бин заново перед каждым вызовом метода
- Никак: request-бины нельзя использовать из синглтонов
- Через scoped proxy, который достаёт бин текущего запросаправильный ответ
Разбор
Request-бин живёт меньше синглтона, поэтому в синглтон внедряется прокси (proxyMode = ScopedProxyMode.TARGET_CLASS, у @RequestScope это по умолчанию). При вызове метода прокси находит экземпляр, привязанный к текущему запросу через RequestContextHolder. Синглтоны не пересоздаются и повторного внедрения нет. Вне веб-запроса такой прокси бросит исключение.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.