Was ist der Unterschied zwischen @ApplicationScoped und @Singleton scopes in CDI?
In CDI gibt es die @ApplicationScoped
und die (javax.inject
) @Singleton
pseudo-scope. Was ist der Unterschied zwischen Ihnen? Neben der Tatsache, dass @ApplicationScoped
ist Proxy, und @Singleton
nicht.
Kann ich nur meine @Singleton
bean zu @ApplicationScoped
? Kann @ApplicationScoped
bean haben zwei (oder mehr) Instanzen?
Haben Sie Lesen Sie die Schweißen-Referenz? Es ist eine Erklärung über die praktischen Unterschiede zwischen
Ich finde auch die Zusammenfassung der Unterschiede am Ende dieses Artikels germanescobar.net/2010/04/... nützlich
die Singleton-scope beziehen Sie sich - javax.ejb oder javax.injizieren?
@ApplicationScoped
und @Singleton
im Abschnitt 5.4 (S. 36).Ich finde auch die Zusammenfassung der Unterschiede am Ende dieses Artikels germanescobar.net/2010/04/... nützlich
die Singleton-scope beziehen Sie sich - javax.ejb oder javax.injizieren?
InformationsquelleAutor amorfis | 2010-12-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
@Singleton
ist nicht Teil der CDI-Spezifikation. Es ist Teil der EJB undjavax.inject
(JSR-330). Es wird nicht erwähnt in der Spezifikation was ist Ihr Verhalten, so können Sie sich nur berufen auf das, was in der Schweißnaht-Dokumentation.Ich habe die CDI-spec vor mir. Ich habe selbst implementierten Teile und es nicht erwähnt nichts über die
@Singleton
. Es wird gezeigt, in der nur ein Beispiel, ohne Erklärungen. Es ist wahr, dass die CDI setzt aufjavax.inject
, aber streng genommen ist es nicht Teil der CDI-Spezifikation. Das sagte, korrigierte ich meine Antwort ein bisschen.InformationsquelleAutor Bozho
kurz gesagt: Sie können sogar mischen Sie es (
@Singleton
und@ApplicationScoped
) und es macht Sinn, in einigen Szenarien.(und wie erwartet arbeitet in mir!)
Zusätzlich zu den anderen Antworten so weit, ich möchte noch hinzufügen, einige weitere Punkte zur Klärung in der realen Welt Szenarien.
Mir diese Frage entwickelte sich aus Wie kann ich erzwingen, ein application-scoped bean zu instanziieren, die beim Start der Anwendung?
In einigen Diskussion dort erklärte ich dies und das nicht finden können, ein gültiges argument gegen es so weit:
(fraglich, aber nicht schlüssige) Argumente (aus meiner Sicht) gegen ihn so weit:
(@BalusC und alle anderen: ich würde gerne sehen, wie Sie drauf ist schlüssig, aber wenn nicht, kann die oben für wahr halten und trotzdem die Argumente können noch helfen dem Leser, die Unterschiede/Vorteile/Nachteile/schlechte/gute Praktiken)
EJB vs. Managed Bean
aber:
... die immer noch wahr in meinem Fall.
Singleton EJB vs. Application-Scoped Bean
Sperren
aber:
(Ich kann nicht sehen, den Vorschlaghammer hier - sorry ...)
Es ist gut zu wissen, das sperren von Vorgaben (ich war mir dessen nicht bewusst), aber das scheint falsch zu sein wieder: Oracle Java EE 6 Tutorial auf Verwaltung Gleichzeitigen Zugriff in einem Singleton Session Bean
InformationsquelleAutor Andreas Dietrich
@Singleton
im JSR-299 bezieht sich auf Singleton session beans (javax.ejb.Singleton
, nichtjavax.inject.Singleton
), nicht JSR-299 managed beans in einem integrierten Rahmen namens Singleton.Vielleicht finden Sie in Ihrem server, die
@ApplicationScoped
ist eine pro OHR oder einmal pro KRIEG/EJB-JAR, wie es ist nicht klar, in der Spezifikation, aber man sollte definitiv nicht erwarten, dass es zu einer pro JVM.InformationsquelleAutor covener
In der Regel, wenn Sie wollen, um nur eine Instanz von einem Objekt sollten Sie wahrscheinlich verwenden
@ApplicationScoped
annotation - Objekt wird umgeleitet und kann somit auch ordnungsgemäß serialisiert wird out-of-the-box.Auf der anderen Seite gibt es auch viele Fälle, wo Sie möchten, dass nur eine Instanz der Klasse, aber eine solche Klasse kann nicht umgeleitet werden (z.B. weil der Letzte) - dann
@Singleton
ist eine Rettung. DaSingleton
ist ein pseudo-scope und ist nicht umgeleitet, wie jeder "normale" Umfang.InformationsquelleAutor G. Demecki
Gibt es noch einen weiteren Unterschied:
@Singleton
ist nicht bean Definition annotations, als dieSingleton
Umfang ist nicht ein normaler Rahmen.Dann
@ApplicationScoped
ist bean Definition annotations.Mit CDI-1.1-spec: Bei der Anwendung im discovery-mode = kommentierten, Schweißen nicht identifizieren Bohnen mit
@Singleton
und nicht geladen wird dieserInformationsquelleAutor vigor
Einer der großen Unterschiede, Sie können schreiben Sie Ihre Klasse mit Standard-Auftragnehmer hat die private-zugriffsmodifizierer bei der Verwendung
javax.inject.Singleton
, aber die Klasse sollte standardmäßig Auftragnehmer mit mindestens Standard-zugriffsmodifizierer bei der Verwendungjavax.enterprise.context.ApplicationScoped
- und dies istJBOSS 6.1 GA Final
UmsetzungInformationsquelleAutor user1017344