Avoir beaucoup de haricots non utilisés dans un contexte de haricots printaniers gaspille-t-il des ressources importantes?

StackOverflow https://stackoverflow.com/questions/98320

  •  01-07-2019
  •  | 
  •  

Question

Ma couche de modèle est utilisée par une poignée de projets différents et j'aimerais utiliser un seul fichier de configuration XML Spring pour le modèle, quel que soit le projet utilisé.

Ma question est la suivante: étant donné que tous les haricots ne sont pas utilisés dans tous les projets, est-ce que je gaspille des ressources en quantités considérables s’il n’est pas instancié? Je ne suis pas sûr de la lenteur du Printemps à les charger car cela n’a jamais été un problème jusqu’à présent.

Des idées?

Était-ce utile?

La solution

Tiré de Printemps Manuel de référence :

  

Le comportement par défaut des implémentations ApplicationContext consiste à pré-instancier avec empressement tous les beans singleton au démarrage. La pré-instanciation signifie qu'un ApplicationContext créera et configurera avec impatience tous ses beans singleton dans le cadre de son processus d'initialisation. En règle générale, c’est une bonne chose, car cela signifie que toutes les erreurs de configuration ou d’environnement seront immédiatement détectées (par opposition à des heures, voire des jours, dans l’avenir).

     

Cependant, il arrive parfois que ce comportement ne soit pas souhaité. Si vous ne voulez pas qu'un bean singleton soit pré-instancié lors de l'utilisation d'un ApplicationContext, vous pouvez le contrôler de manière sélective en marquant une définition de bean comme étant initialisée paresseuse. Un bean paresseux initialisé indique au conteneur IoC si une instance de bean doit être créée au démarrage ou à la première demande.

     

Lors de la configuration de beans via XML, ce chargement différé est contrôlé par l'attribut 'lazy-init' sur l'élément [bean]; par exemple:

<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"/>

Toutefois, à moins que vos beans n'utilisent des ressources telles que des verrous de fichiers ou des connexions à une base de données, je ne m'inquiéterais pas trop de la surcharge de mémoire s'il était plus facile d'avoir cette configuration pour plusieurs profils (mais différents).

Autres conseils

En plus des autres commentaires: il est également possible de spécifier un fichier de configuration complet à initialiser paresseusement, en utilisant l'attribut 'default-lazy-init' sur l'élément <beans/>; par exemple:

<beans default-lazy-init="true">
    <!-- no beans will be pre-instantiated... -->
</beans>

C’est beaucoup plus facile que d’ajouter l’attribut lazy-init à chaque bean, si vous en avez beaucoup.

Par défaut, les beans Spring sont des singletons et sont instanciés lorsque le contexte de l'application est créé (au démarrage). En supposant que vous n'ayez pas remplacé le comportement par défaut, une seule instance de chaque bean sera créée.

Dépend des objets.

Cependant, le code inutilisé est "cruft" et augmentera les coûts de maintenance.

Mieux vaut supprimer les références et les classes. Vous pouvez toujours restaurer à partir du contrôle de version s'ils sont nécessaires ultérieurement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top