web-dev-qa-db-fra.com

Scopes de haricots de printemps

Quelqu'un peut-il expliquer quels sont les champs d'application des haricots de printemps que j'ai toujours utilisés uniquement de «prototype», mais y a-t-il d'autres paramètres que je peux mettre en place?

Exemple de ce dont je parle

    <bean id="customerInfoController" class="com.action.customer.Controller" scope="prototype">
    <property name="accountDao" ref="accountDao"/>
    <property name="utilityDao" ref="utilityDao"/>
    <property name="account_usageDao" ref="account_usageDao"/>  
</bean>
45
gcalex5

Parmi les spécifications de printemps , cinq types de champs de haricots sont pris en charge:

1. singleton (par défaut *)

Etend une définition de bean unique à une instance d'objet unique par Spring Conteneur IoC.

2. prototype

Etend une définition de bean unique à un nombre illimité d'instances d'objet.

3. demande

Étend une définition de bean unique au cycle de vie d'un seul HTTP demande; c'est-à-dire que chaque requête HTTP aura son propre fichier exemple d'un haricot créé à l'arrière d'une définition de haricot unique . Valable uniquement dans le contexte d'un Spring ApplicationContext compatible Web.

4. session

Étend une définition de bean unique au cycle de vie d'une session HTTP . Valable uniquement dans le contexte d'un Spring ApplicationContext compatible Web.

5. session globale

Étend une définition de bean unique au cycle de vie d'un HTTP global Session. Généralement valide uniquement lorsqu'il est utilisé dans un contexte de portlet. Seulement valide dans le contexte d'un Spring ApplicationContext compatible Web.

* default signifie qu'aucune portée n'est explicitement fournie dans la balise <bean /> . en savoir plus à leur sujet ici: http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s04 .html

73
Juned Ahsan

Dans Spring, la portée du bean est utilisée pour décider quel type d'instance de bean doit être renvoyé du conteneur Spring à l'appelant.

5 types d'étendues de haricots sont supportés:

  1. Singleton: Il retourne une seule instance de bean par conteneur Spring IoC. Cette instance unique est stockée dans le cache de ces beans singleton. spécifié dans le fichier de configuration du bean, default to singleton.

  2. Prototype : Renvoie une nouvelle instance de bean à la demande. Il ne stocke aucune version de cache comme singleton. 

  3. Request : Renvoie une seule instance de bean par requête HTTP.

  4. Session : Renvoie une seule instance de bean par session HTTP (session de niveau utilisateur).

  5. GlobalSession : Renvoie une seule instance de bean par session HTTP globale. Il n'est valide que dans le contexte d'un Spring ApplicationContext (session au niveau de l'application) compatible Web.

Dans la plupart des cas, vous ne pouvez utiliser que les domaines de base de Spring - singleton et prototype , et par défaut/ singleton .

18
Divyesh Kanzariya

Je souhaite simplement mettre à jour que, au printemps 5, comme indiqué dans Spring docs , Spring prend en charge 6 portées, dont quatre ne sont disponibles que si vous utilisez un ApplicationContext compatible Web.

singleton (défaut) étend une définition de bean unique à une instance d'objet unique par conteneur Spring IoC.

prototype Etend une définition de bean unique à un nombre illimité d'instances d'objet.

demande Étend une définition de bean unique au cycle de vie d'une requête HTTP unique; c'est-à-dire que chaque requête HTTP a sa propre instance d'un bean créée à l'arrière d'une définition de bean unique. Valable uniquement dans le contexte d'un Spring ApplicationContext compatible Web.

session Étend une définition de bean unique au cycle de vie d'une session HTTP. Valable uniquement dans le contexte d'un Spring ApplicationContext compatible Web.

application Étend une définition de bean unique au cycle de vie d'un ServletContext. Valable uniquement dans le contexte d'un Spring ApplicationContext compatible Web.

websocket Étend une définition de bean unique au cycle de vie d'un WebSocket. Valable uniquement dans le contexte d'un Spring ApplicationContext compatible Web.

6
heyjr

La documentation Spring décrit les portées standard suivantes :

singleton: (valeur par défaut) étend une définition de bean unique à une instance d'objet unique par conteneur Spring IoC.

prototype: étend une définition de bean unique à un nombre illimité d'instances d'objet.

request: étend une définition de bean unique au cycle de vie d'une seule requête HTTP; c'est-à-dire que chaque requête HTTP a sa propre instance d'un bean créée à l'arrière d'une définition de bean unique. Valable uniquement dans le contexte d'un Spring ApplicationContext compatible Web.

session: étend une définition de bean unique au cycle de vie d'une session HTTP. Valable uniquement dans le contexte d'un Spring ApplicationContext compatible Web.

global session: étend une définition de bean unique au cycle de vie d'une session HTTP globale. Généralement valide uniquement lorsqu'il est utilisé dans un contexte de portlet. Valable uniquement dans le contexte d'un Spring ApplicationContext compatible Web.

Des étendues personnalisées supplémentaires peuvent également être créées et configurées à l'aide de CustomScopeConfigurer. Un exemple serait la portée flow ajoutée par Spring Webflow.

En passant, vous affirmez que vous avez toujours utilisé prototype ce que je trouve étrange. La portée standard est singleton et dans l'application que je développe, j'ai rarement besoin de la portée du prototype. Vous devriez peut-être jeter un coup d'oeil à cela.

5
LaurentG

Vous trouverez une explication détaillée de chaque étendue ici dans Étendues de haricots de printemps . Ci-dessous le résumé

Singleton - (Valeur par défaut) Étend une définition de bean unique à une instance d'objet unique par conteneur Spring IoC.

prototype - Étend une définition de bean unique à un nombre illimité d'instances d'objet.

request - Étend une définition de bean unique au cycle de vie d'une requête HTTP unique; c'est-à-dire que chaque requête HTTP a sa propre instance d'un bean créée à l'arrière d'une définition de bean unique. Valable uniquement dans le contexte d'un Spring ApplicationContext compatible Web.

session - Étend une définition de bean unique au cycle de vie d'une session HTTP. Valable uniquement dans le contexte d'un Spring ApplicationContext compatible Web.

global session - Étend une définition de bean unique au cycle de vie d'une session HTTP globale. Généralement valide uniquement lorsqu'il est utilisé dans un contexte de portlet. Valable uniquement dans le contexte d'un Spring ApplicationContext compatible Web.

5
Vikas V

À propos du haricot prototype:

Le code client doit nettoyer les objets à portée prototype et libérer ressources coûteuses que le ou les prototypes de haricots contiennent. Pour obtenir le Conteneur à ressort permettant de libérer les ressources détenues par des haricots à l’image du prototype, essayez d'utiliser un post-processeur de bean personnalisé, qui contient une référence à haricots qui doivent être nettoyés.

ref: https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html#beans-factory-scopes-prototype

0
emon

Selon la documentation of Spring-Cloud-Config, il existe une portée supplémentaire à côté des cinq existantes. C'est @RefreshScope.

Voici la brève description de RefreshScope:

Quand il y a un changement de configuration, un Spring @Bean qui est marqué comme @RefreshScope reçoit un traitement spécial. Cette fonctionnalité concerne le problème de beans stateful dont seule la configuration est injectée quand ils sont initialisés. Par exemple, si un DataSource a ouvert connexions lorsque l’URL de la base de données est modifiée via l’environnement, vous veulent probablement que les détenteurs de ces connexions soient en mesure de compléter ce qu'ils font. Ensuite, la prochaine fois que quelque chose emprunte un connexion du pool, il en obtient un avec la nouvelle URL.

Parfois, il peut même être obligatoire d’appliquer @RefreshScope annotation sur certains haricots qui ne peuvent être initialisés qu'une seule fois. Si un haricot est "immuable", vous devrez soit annoter le haricot avec @RefreshScope ou spécifiez le nom de la classe sous la clé de propriété spring.cloud.refresh.extra-refreshable.

Les beans d'actualisation de la portée sont des proxy paresseux qui s'initialisent lorsqu'ils sont utilisé (c’est-à-dire quand une méthode est appelée), et la portée agit comme un cache des valeurs initialisées. Pour forcer un haricot à se réinitialiser sur le prochain appel de méthode, vous devez invalider son entrée de cache.

RefreshScope est un bean dans le contexte et a un public Méthode refreshAll () pour actualiser tous les beans de l'étendue en effaçant le fichier cache cible. Le point de terminaison/refresh expose cette fonctionnalité (via HTTP ou JMX). Pour actualiser un bean individuel par son nom, il existe également un Méthode refresh (String).

0
zappee