Как точно работает область Spring сеанса bean? какова область по умолчанию для bean в веб-контексте?

Я изучаю Spring MVC, и у меня есть следующие сомнения:

  • Какова цель области сеанса?

Читая документацию, я знаю, что это определяет определение bean для сеанса HTTP. Действителен только в контексте веб-приложения Spring ApplicationContext. А также, что новый экземпляр создается один раз за сеанс пользователя.

Но когда именно он используется? и с какой целью? Вы можете сделать практический пример?

  1. В Spring MVC, какова область по умолчанию в веб-контексте?

Я знаю, что в Spring по умолчанию для bean используется singleton, но как насчет области действия bean в веб-контексте?

Ответ 1

Ans 1) область сеанса очень похожа на область HttpSession. Beans, созданный на основе области видимости сеанса, проходит через сеанс HTTP. Подобно области запроса, она применима только для контекстно-ориентированных веб-приложений spring.

/** * Annotation-based configuration of session scope */ 
@Component
@Scope("session") 
public class ShopCart { }

а затем

@Inject
private ShopCart cart;

Ans 2) По умолчанию используется Singleton везде.

Ответ 2

  • Вы используете spring сеанс beans для beans, которые являются состояниями, и их состояние различается для каждого пользователя. Это могут быть, например, предпочтения пользователя в настоящее время.
  • Область по умолчанию bean в spring является односторонней, и она не отличается в контексте веб-приложения.

Обратите внимание, что в веб-среде вы также можете использовать область REQUEST beans, и их время жизни зависит только от одного пользовательского запроса. Вы должны использовать область запроса, когда сеанс не нужен, и запрос достаточен.

Кроме того, в среде портлета вы можете использовать другую область, которая является GLOBAL SESSION. Каждый портлет имеет свою независимую сессию, и обычно эти портлеты предпочитают иметь собственное состояние, заключенное только для себя. Но если вам нужно разделить данные сеанса между различными портлетами, вам нужно будет использовать глобальную область сеанса.

Ответ 3

Фактически Spring поможет вам создать область сеанса bean вместо традиционного способа

httpSession.setAttribute("Object",new Object());
&&
httpSession.getAttribute("Object");

и Spring обеспечивают этот эффективный способ

@Component
@Scope("session")
public class Foo{
}

теперь это головная боль Spring для создания и уничтожения этого связанного объекта сеанса с помощью Factory Pattern

Ответ 4

У меня была та же проблема, я использовал:

@Component
@Scope("session")

И это сделало магию для меня:

@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) 

Я надеюсь, что это поможет; -)

Ответ 5

Но когда именно это используется? и с какой целью? Можете ли вы сделать практический пример?

В одном из моих веб-приложений Spring MVC на основе JSP мы используем его для хранения данных, которые не меняются после первого запроса пользователя в сеансе, т.е. Мы заполняем поля этого bean-компонента, когда пользователь впервые приходит на сервер, а затем мы используем (также известный как чтение) эти значения в последующих запросах (следующие запросы в сеансе), например, имя пользователя, группа пользователей, адрес, зарегистрированный номер клиента и т.д. и т.д.

Эти значения констант являются обязательными и необходимы во всех сообщениях журнала или во всех SQL-запросах.

Маршрутизация запросов разработана таким образом, что заполнение бинов (установка свойств бинов) происходит только один раз за сеанс.

Другая интересная часть, как указано в ответе Ясира Шаббира Чоудхари, что вы можете имитировать то же поведение, используя традиционный способ.

Сохраняется ли bean-объект области Spring в HttpSession?

На ваш второй вопрос многие уже ответили, что объем по умолчанию - Singleton применим и здесь.