8
votes

Prototype de printemps Haricots et avantages du printemps

Je me fais progressivement de prendre progressivement avec le printemps depuis un moment et je pense avoir une idée raisonnable des concepts, mais je suis tombé sur des informations dans un autre de mes discussions qui avaient transformé les choses à l'envers pour moi ...

"... Bien que les méthodes de rappel de cycle de vie d'initialisation soient appelées tous les objets indépendamment de la portée, dans le cas de prototypes, des rappels de la vie de destruction configurés ne sont pas appelés. Le code client doit nettoyer les objets de prototype et libérer des ressources coûteuses Les prototypes de haricans tiennent. Pour obtenir le récipient à ressort pour libérer les ressources détenues par des haricots à prototype, essayez d'utiliser un post-processeur de haricot personnalisé, qui contient une référence aux haricots qui doivent être nettoyés. "

Cela m'a fait penser que j'ai des cas d'utilisation réels où j'aimerais utiliser des haricots prototypes où, par exemple, j'ai besoin d'une nouvelle instance de haricots par demande. Cependant, à partir de ce que je comprends de cet extrait (à partir du printemps 3 Docs), le printemps se tient à une référence aux haricots qui doivent être nettoyés (la référence elle-même signifiant que le haricot ne sera pas effacé automatiquement par le collecteur des ordures). De plus, je le prends que les ressources détenues par le prototype doivent être nettoyées manuellement.

Quelqu'un peut-il me faire savoir si cela est correct? Si oui, y a-t-il un motif typique utilisé pour y faire face? J'apprécierais une réponse qui pourrait décrire la raison d'architecture pour laquelle le printemps implémente des haricots prototypes de cette manière.


2 commentaires

Au cas où vous en avez besoin sur demande, vous pouvez demander la portée de l'utilisateur;) static.springsource.org/spring/docs/3.0.0.m3/...


@Spaeth Désolé, j'ai peut-être été trompeur ... Ce n'est pas une application Web, j'essayais simplement de démontrer la nécessité d'une nouvelle instance à créer pour gérer "quelque chose" se produire


3 Réponses :


19
votes

Spring tient à une référence aux haricots qui doivent être nettoyés (la référence elle-même signifiant que le haricot ne sera pas effacé automatiquement par le collecteur des ordures).

Oui, mais le conteneur ne contient pas de références à des haricots prototypes. C'est la raison pour laquelle les rappels de destruction ne sont pas appelés: le ressort crée une instance de haricot, file et appelle les rappels de construction. Cela donne une instance et oublie ce haricot.

Vous pouvez créer des haricots à prototype par demande. Le printemps vous donnera une instance et le moment où vous n'avez aucune référence à ce haricot (le printemps ne conserve pas une!), Il sera rassemblé. Mais depuis le printemps ne sait rien de votre haricot après la création - il ne peut appeler aucun rappel de destruction. En fait, cela revient à une question: pourquoi Java n'a pas de destructeurs.

Alors, comment nettoyez-vous les haricots à prototype? Eh bien, tout comme vous nettoyez toutes les autres ressources en Java - explicitement. Fournir Fermer () , détruire () , stop () ou quel que soit le nom que vous aimez (envisagez d'implémenter fermeable . Notez que de telles méthodes ne sont pas généralement nécessaires. Le collecteur de déchets sera libéré Le graphique de l'objet entier tandis que les ressources persistantes telles que les connexions de base de données seront fermées lorsque l'ensemble DataSource est fermé.


3 commentaires

Merci pour votre réponse ... C'était la façon dont j'avais pensé qu'il fonctionne avant de lire cet extrait, peut-être que je n'ai peut-être pas mal interprété! Fondamentalement ... continuez comme avant, laissant une traînée de destruction, et tout sera nettoyé derrière moi :-)


Puissiez-vous fournir des références DOC à ce sujet, je veux juste être sûr


"Le ressort ne gère pas le cycle de vie complet d'un haricot prototype: les instanciats du conteneur, configure, décoratent et assemble autrement un objet prototype, les mains au client, puis n'a aucune autre connaissance de cette instance de prototype." docs.spring. io / printemps / docs / 3.0.0.m3 / printemps-cadre-référencé CE / ...



8
votes

Vous avez mal interprété la documentation. Dit explicitement:

Pour obtenir le conteneur de printemps pour libérer des ressources détenues par haricots à prototype, essayez d'utiliser un post-processeur de haricot personnalisé qui tient une référence aux haricots qui doivent être nettoyés.

Donc, le ressort ne contient aucune référence aux haricots prototypes qu'il crée. C'est à vous de créer un post-processeur de haricot qui tiendrait des références à ces haricots si nécessaire.

En outre, il est assez rare que les haricots prototypes contiennent des ressources qui doivent être nettoyées. Par exemple, un pool de connexion (qui doit être détruit correctement à l'arrêt) est typiquement un haricot de singleton. Cela n'aurait pas fort de sens de faire un prototype. Étant donné que les haricots prototypes sont souvent utilisés pendant une petite quantité de temps, le client la créant peut-être peut explicitement libérer ses ressources lorsqu'il ne l'utilise plus. Tout comme lorsque vous créez un nouveau flux ou une nouvelle connexion, et fermez-le enfin.


0 commentaires

5
votes

Spring n'a aucune connaissance quant à tous les instances créées à l'aide de prototypes. Il va simplement instancier et configurer des prototypes de haricots scopés et la remettre au client comme commenté la documentation.

printemps ne gère pas le cycle de vie complet d'un haricot prototype: le conteneurs instanciates, configure, décorations et assemble autrement un objet prototype, les mains au client et n'a plus d'autre chose connaissance de cette instance prototype.

http://static.springsource.org/spring/docs/3.0.0.m3/spring-Framework-reference/html/ch04s04.html#beans-Factory-Scopes-Prototype


0 commentaires