Spring: `RequestScope` против `RequestContextHolder`

#spring #spring-boot #servlets

#весна #весна-загрузка #сервлеты

Вопрос:

Я пишу службу загрузки Spring и хотел включить некоторую форму RequestContext , доступную для контроллеров, которые могут хранить такие вещи, как аутентифицированный пользователь и идентификатор запроса. Однако я вижу несколько подходов:

  1. Используйте @RequestScope компонент
  2. Использовать ServletRequest.setAttribute
  3. Используйте 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 использует объект, ограниченный потоком, для хранения ссылки на контекст запроса, что позволяет программисту обращаться к компонентам даже в методах, которые явно не получают объект запроса.