web-dev-qa-db-fra.com

Comment fonctionne exactement la portée de la session Spring d'un bean? quelle est la portée par défaut d'un bean dans le contexte Web?

J'étudie Spring MVC et j'ai les doutes suivants:

  1. Quel est exactement le but de la portée de la session?

En lisant la documentation, je sais que cela étend une définition de bean à une session HTTP. Valable uniquement dans le contexte d'un Spring ApplicationContext Web. Et aussi qu'une nouvelle instance est créée une fois par session utilisateur.

Mais quand exactement est-il utilisé? et dans quel but? Pouvez-vous en faire un exemple pratique?

  1. Dans Spring MVC quelle est la portée par défaut dans le contexte Web?

Je sais qu'au printemps, la portée par défaut d'un bean est singleton mais qu'en est-il de la portée d'un bean dans le contexte Web?

17
AndreaNobili

L'étendue de la session Ans 1) est très similaire à l'étendue de la session HttpSession. Les beans instanciés en fonction de la portée de la portée de la session vivent via la session HTTP. Semblable à la portée de la demande, il s'applique uniquement aux contextes d'application Spring adaptés au Web.

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

et alors

@Inject
private ShopCart cart;

Rép 2) La valeur par défaut est Singleton partout.

12
sachin k
  1. Vous utilisez des beans session de printemps pour des beans avec état et leur état diffère selon l'utilisateur. Il peut s'agir par exemple des préférences de l'utilisateur actuellement connecté.
  2. La portée par défaut du bean au printemps est singleton et ce n'est pas différent dans le contexte de l'application Web.

Notez que dans l'environnement Web, vous pouvez également utiliser des beans de portée REQUEST et leur durée de vie n'est que pour une demande utilisateur. Vous devez utiliser la portée de la demande lorsque la session n'est pas nécessaire et que la demande est suffisante.

De plus, dans l'environnement de portlet, vous pouvez utiliser une autre étendue qui est GLOBAL SESSION. Chaque portlet a sa propre session indépendante et généralement ces portlets sont préférables pour avoir leur propre état encapsulé uniquement pour eux-mêmes. Mais si vous devez partager des données de session entre différents portlets, vous devrez utiliser la portée de session globale.

13
Vojtech Ruzicka

En fait, Spring vous aide à créer un bean de portée de session à la place de la manière traditionnelle

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

et le printemps offrent ce moyen efficace

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

maintenant c'est le casse-tête du printemps pour créer et détruire cet objet de session associé en utilisant Factory Pattern

J'ai eu le même problème, j'utilisais:

@Component
@Scope("session")

Et cela a fait la magie pour moi:

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

J'espère que ça aide ;-)

6

Mais quand exactement est-il utilisé? et dans quel but? Pouvez-vous en faire un exemple pratique?

Dans l'une de mes applications Web Spring MVC basées sur JSP, nous l'utilisons pour stocker des données qui ne varient pas après la première demande de l'utilisateur dans la session, c'est-à-dire que nous remplissons les champs de ce bean lorsque l'utilisateur arrive pour la première fois sur le serveur, puis nous utilisons (aka lire) ces valeurs dans les requêtes suivantes (prochaines requêtes en session) par ex. nom d'utilisateur , groupe organisationnel d'utilisateurs , adresse , numéro de client connecté etc etc.

Ces valeurs de constantes sont en quelque sorte obligatoires et nécessaires dans tous les messages de journal ou dans toutes les requêtes SQL.

Le routage des demandes est conçu de telle manière que la population de bean (définition des propriétés du bean) ne se produit qu'une seule fois par session.

Autre partie intéressante comme indiqué dans la réponse de Yasir Shabbir Choudhary que vous pouvez imiter le même comportement en utilisant la manière traditionnelle.

Le bean de portée Spring session est-il enregistré dans HttpSession?

Beaucoup de gens répondent déjà à votre deuxième question que la portée par défaut - Singleton s'applique ici aussi.

0
Sabir Khan