In CDI gibt es das @ApplicationScoped
und das ( javax.inject
) @Singleton
Pseudo-Scope. Was ist der Unterschied zwischen ihnen? Neben der Tatsache, dass @ApplicationScoped
Proxy ist und @Singleton
nicht.
Kann ich meine @Singleton
Bohne einfach ändern @ApplicationScoped
? Kann @ApplicationScoped
Bean zwei (oder mehr) Instanzen haben?
@ApplicationScoped
und@Singleton
in Abschnitt 5.4 (S. 36).Antworten:
@Singleton
ist nicht Teil der CDI-Spezifikation. Es ist Teil von EJB undjavax.inject
(JSR-330). In der Spezifikation wird nicht erwähnt, wie es sich verhält, daher können Sie sich nur auf das verlassen, was in der Schweißdokumentation geschrieben steht.quelle
@Singleton
. Es wird nur in einem Beispiel ohne Klarstellung gezeigt. Es ist wahr, dass CDI sich darauf verlässtjavax.inject
, aber genau genommen ist es nicht Teil der CDI-Spezifikation. Trotzdem habe ich meine Antwort etwas korrigiert.Kurz gesagt: Sie können es sogar mischen (
@Singleton
und@ApplicationScoped
) und es macht in einigen Szenarien Sinn. (und funktioniert wie erwartet in meinem!)Zusätzlich zu den anderen bisherigen Antworten möchte ich einige weitere Punkte zur Verdeutlichung in realen Szenarien hinzufügen.
Für mich entstand diese Frage aus Wie erzwinge ich, dass eine Bean mit Anwendungsbereich beim Start der Anwendung instanziiert wird? In einigen Diskussionen dort habe ich dies festgestellt und kann bisher kein gültiges Argument dagegen finden:
(umstrittene, aber nicht schlüssige) Argumente (aus meiner Sicht) bisher dagegen: (@BalusC und alle anderen: Ich würde gerne sehen, dass sie schlüssig sind, aber wenn nicht, kann das oben Gesagte zutreffen, und dennoch können die Argumente zutreffen helfen Sie dem Leser immer noch, die Unterschiede / Vor- / Nachteile / schlechten / guten Praktiken herauszufinden)
EJB vs. Managed Bean
aber:
... was in meinem Fall immer noch gilt.
Singleton EJB vs. Application Scoped Bean
Verriegeln
aber:
(Ich kann den Vorschlaghammer hier nicht sehen - Entschuldigung ...) Es ist gut, die Standardeinstellungen für das Sperren zu kennen (mir war dies nicht bekannt), aber dies scheint wieder falsch zu sein: Oracle Java EE 6-Lernprogramm zum Verwalten des gleichzeitigen Zugriffs in a Singleton Session Bean
quelle
Wenn Sie nur eine Instanz eines Objekts haben möchten, sollten Sie normalerweise eine
@ApplicationScoped
Annotation verwenden. Dieses Objekt wird als Proxy verwendet und kann daher sogar sofort ordnungsgemäß serialisiert werden.Auf der anderen Seite gibt es auch viele Fälle, in denen Sie nur eine Instanz der Klasse möchten, diese Klasse jedoch nicht vertreten werden kann (z. B. weil sie endgültig ist) - dann
@Singleton
ist dies eine Rettung. WeilSingleton
es sich um einen Pseudo-Bereich handelt und nicht wie ein "normaler" Bereich übertragen wird.quelle
@Singleton
in JSR-299 bezieht sich auf Singleton-Session-Beans (javax.ejb.Singleton
nichtjavax.inject.Singleton
), nicht auf JSR-299-verwaltete Beans in einem integrierten Bereich namens Singleton.Möglicherweise finden Sie in Ihrem Server
@ApplicationScoped
eine pro EAR oder eine pro WAR / EJB-JAR, da dies in der Spezifikation nicht klar ist, aber Sie sollten definitiv nicht erwarten, dass es eine pro JVM ist.quelle
Es gibt noch einen weiteren Unterschied:
@Singleton
Definiert keine Bean-Annotationen, da derSingleton
Bereich kein normaler Bereich ist. Dann@ApplicationScoped
definiert Bean Annotationen.Mit CDI 1.1-Spezifikation: Wenn die Anwendung im Erkennungsmodus = kommentiert ist, identifiziert Weld Beans nicht mit dieser
@Singleton
und lädt sie nichtquelle
Einer der Hauptunterschiede, den Sie beim Schreiben Ihrer Klasse mit dem Standardkonstruktor machen können, ist der private Zugriffsmodifikator bei der Verwendung
javax.inject.Singleton
. Ihre Klasse sollte jedoch den Standardkonstruktor mit mindestens dem Standardzugriffsmodifikator bei der Verwendung haben.javax.enterprise.context.ApplicationScoped
Dies ist dieJBOSS 6.1 GA Final
Implementierungquelle