web-dev-qa-db-fra.com

Quand utiliser la portée du prototype Spring?

Je veux savoir quand dois-je utiliser exactement la portée prototype au printemps? J'ai compris que singleton renvoie la même instance d'objet si le bean est demandé.

Alors pourquoi devrions-nous envisager prototype?

Des explications avec des exemples aideraient beaucoup à en comprendre la nécessité.

23
Rahul

Pour être des définitions simples et claires:

  • Portée du prototype = Un nouvel objet est créé chaque fois qu'il est injecté/recherché. Il utilisera à chaque fois une nouvelle SomeBean().

  • Portée singleton = Le même objet est renvoyé chaque fois qu'il est injecté/recherché. Ici, il instanciera une instance de SomeBean puis la renverra à chaque fois.

Le bean prototype est créé au moment de l'utilisation. Ainsi, lorsque vous souhaitez avoir des beans statefull, il est parfois nécessaire d'avoir une portée de prototypes ou lorsque vous n'avez pas l'habitude de mettre en cache des valeurs dans les beans. Le bean prototype peut être associé à une session ou à un appel.

Exemple:

Un objet d'accès aux données (DAO) n'est généralement pas configuré en tant que prototype, car un DAO typique ne détient aucun état conversationnel; il était simplement plus facile pour cet auteur de réutiliser le cœur du diagramme singleton.

14
RMachnik

Il existe des cas d'utilisation intéressants en utilisant scope prototype vous construirez une conception/architecture d'application meilleure et fiable, par exemple, un système en temps réel.

Imaginez que vous devez créer un système en temps réel pour le suivi des véhicules, et que vous aurez 2 000 000 de voitures partageant des informations toutes les 5 secondes. Côté serveur, vous travaillerez avec deux ou plusieurs groupes de configurations distincts, un pour les voitures et un autre un pour les camions.

Sur la base de cet exemple simple, si vous concevez votre application pour fonctionner avec des groupes de configuration distincts en mémoire via le modèle de prototype, vous obtiendrez de meilleures performances.

Ainsi, dans ce cas, chaque fois que le serveur reçoit un nouveau message d'un camion, par exemple, le serveur obtient l'instance de la configuration en mémoire à partir d'une table de hachage d'instances de VehicleGrupConfiguration, puis applique la configuration comportement que ce message doit avoir, par exemple: comme le délai d'attente, réessayer ... et etc.

Je voudrais souligner qu'il existe de nombreuses façons de mettre en œuvre cette situation, mais cet exemple montre qu'un modèle prototype est très puissant en matière de performances et de modèles de conception.

7
Lucas Pires

Comme le dit la documentation, créer un bean Foo avec la portée du prototype revient à appeler:

Foo foo = new Foo(dependency1, dependency2, ...);
foo.initialize(dependency7, dependency8...);

La seule bonne raison d'utiliser un prototype de bean de portée au lieu de new, c'est lorsque les dépendances utilisées pour la création et l'initialisation de l'instance doivent être conservées en dehors du code qui a besoin d'une nouvelle instance.

Un exemple est si vous vouliez écrire du code de persistance similaire à EJB2 Java beans entité, tels que

Person p = ...
p.setName("John Doe");
p.save(); // write to DB

Au lieu d'utiliser la méthode JPA

Person p = new Person();
p.setName("John Doe");
personService.save(p); // write to DB

Dans le style de code de bean entité, l'instance personne doit savoir comment elle doit être conservée, elle doit donc être injectée avec des détails de persistance dont le code écrivant une personne ne devrait pas être au courant.

Un autre exemple: si vous souhaitez utiliser la classe SimpleDateFormat non-threadsafe Java à de nombreux endroits de votre application, avec un modèle de format à partir d'un fichier de configuration (peut-être en utilisant différents formats en fonction d'autres conditions). Au lieu de créer une nouvelle instance de format dans tous ces endroits en chargeant également la chaîne de formatage à partir d'un fichier (ou d'une propriété spring), vous pouvez utiliser la portée du prototype pour obtenir une nouvelle instance à chaque fois, avec les détails de la définition du format commun dans un seul. endroit.

0
tkruse