2012-05-13 2 views
8

Standardmäßig ist das Bean, das von Spring erstellt wird, Singleton. Sie sind Thread-sicher, weil sie staatenlos sind. Wenn Spring eine statusbehaftete Bean erstellen soll, müssen wir den Prototypbereich für die Bean-Definition verwenden. Wir müssen uns um die Thread-sicheren Probleme kümmern. Alle Staatenlosen Bohnen werden verschmutzt, wenn sie von der Prototypbohne injiziert werden. Also, ich kann mir nicht vorstellen, wo wir den Prototypbereich verwenden können. Kannst du ein typisches Szenario geben, dass wir Spring Bean benutzen können/müssen? Wie können wir auch die statusbehaftete Verschmutzung anderer Singleton-Bohnen zunichte machen?Wofür wird der Prototyp Spring Bean verwendet?

Antwort

12

Es gibt viele Gründe, den Prototypbereich zu verwenden, z. B. wenn Sie "new" anstelle von Singleton verwenden. Eine Bean pro Benutzer, eine Bean pro Request, eine Sammlung eindeutiger Beans usw. Verwenden Sie in Nicht-Trivial-Anwendungen schließlich nicht mehr Singletons als Singletons?

Singleton-Bohnen sind nicht thread-sicher, weil sie Singletons sind – sie müssen geschrieben Thread-sicher sein. Sie werden nicht magisch fadensicher. Der Umfang einer Bean ist genau das, ihr Umfang: sie macht die Bean für den bestimmten Bereich – nicht passend, das liegt beim Entwickler.

+0

Ich muss meinem guten Freund Dave hier widersprechen. Persönlich hatte ich 0 gute Gründe, einen Prototyp Spring Bean in irgendeiner meiner Produktionsanwendungen zu schaffen. Ich würde mich fragen, warum brauchen Sie dieses Objekt als Bohne. Wenn es wirklich ein Stateful-Objekt ist, ist es eine Entity-Bean, die es von JPA oder JDBC erstellt hat, sodass Sie sowieso nicht neu aufrufen? Ist es ein View-DTO-ähnliches Objekt, rufen Sie dort einfach wieder neu an. Hier ist ein Link zu Marten sagt das gleiche .. http://forum.spring.io/forum/spring-projects/container/81737-when-to-set-scope-as-prototype – user1567291

+0

Erklärungen auf downvotes, vor allem, wenn die Antwort richtig, vollständig und akzeptiert ist, sind im Allgemeinen eine gute Idee. –

1

Ich nehme prototypische Scoped-Beans als Alternative zu Factory-Klassen, die zum Erstellen von Objekten verwendet werden, wahr. Der Unterschied ist im Falle von Prototyp-Beans Frühjahr sparen Sie einige Code für die Abhängigkeit Injektion und wird auch automatisch Ihre Objekte für Transaktionen usw. Proxy wenn angemessen.

Ich selbst bevorzuge den Fabrikansatz. Ein vernünftiges Szenario für den Prototypumfang, dem ich begegnete, war ein zustandsbehaftetes Objekt, das von verschiedenen bekannten Beans benötigt wurde und jeder eine eigene Kopie benötigte. Eine dedizierte Factory-Klasse wäre in diesem Szenario überflüssig, da ich Objekte nicht im laufenden Betrieb, sondern nur während der Instanziierung anderer Beans erstellen musste.