#spring #spring-boot #servlets
#весна #весна-загрузка #сервлеты
Вопрос:
Я пишу службу загрузки Spring и хотел включить некоторую форму RequestContext
, доступную для контроллеров, которые могут хранить такие вещи, как аутентифицированный пользователь и идентификатор запроса. Однако я вижу несколько подходов:
- Используйте
@RequestScope
компонент - Использовать
ServletRequest.setAttribute
- Используйте Spring
RequestContextHolder
Каковы компромиссы между этими подходами?
Комментарии:
1. Является ли это реактивным или mvc-контекстом? Это не ответ, но я предлагаю вам взглянуть на аргументы метода RequestMapping: docs.spring.io/spring-framework/docs/current/javadoc-api/org /… . Он находится в классе javadoc в виде маркированного списка.
Ответ №1:
Вообще говоря, RequestScope
это весенний волшебный путь. Он внутренне использует a RequestContextHolder
, который , в свою очередь , зависит от ServletRequest.setAttribute
. Сказано по-другому, по-весеннему, это ИМХО RequestScope
. RequestContextHolder
имеет смысл, если вы предпочитаете ограничить магию весенних аннотаций. Наконец, ServletRequest.setAttribute
это все еще более низкий уровень, и его следует использовать в основном, если вы хотите, чтобы код был совместим с приложением, отличным от Spring.
Более того, для первых двух способов Spring использует объект, ограниченный потоком, для хранения ссылки на контекст запроса, что позволяет программисту обращаться к компонентам даже в методах, которые явно не получают объект запроса.