Dans CDI, il y a la pseudo-portée @ApplicationScoped
et la ( javax.inject
) @Singleton
. Quelle est la différence entre eux? Outre le fait qui @ApplicationScoped
est mandaté, et @Singleton
ne l'est pas.
Puis-je simplement changer mon @Singleton
haricot en @ApplicationScoped
? Le @ApplicationScoped
bean peut-il avoir deux instances (ou plus)?
@ApplicationScoped
et@Singleton
à sa section 5.4 (p. 36).Réponses:
@Singleton
ne fait pas partie de la spécification CDI. Il fait partie d'EJB etjavax.inject
(JSR-330). Il n'est pas mentionné dans la spécification quel est son comportement, vous ne pouvez donc vous fier qu'à ce qui est écrit dans la documentation Weld.la source
@Singleton
. Il n'est montré que dans un seul exemple, sans clarification. Il est vrai que CDI s'appuie surjavax.inject
, mais à proprement parler, cela ne fait pas partie de la spécification CDI. Cela dit, j'ai corrigé un peu ma réponse.en bref: vous pouvez même le mélanger (
@Singleton
et@ApplicationScoped
) et cela a du sens dans certains scénarios. (et fonctionne comme prévu dans le mien!)En plus des autres réponses jusqu'à présent, j'aimerais ajouter quelques points supplémentaires pour clarifier les scénarios du monde réel.
Pour moi, cette question a été développée à partir de Comment forcer un bean d'application à instancier au démarrage de l'application? Dans une discussion là-bas, j'ai déclaré ceci et je ne peux pas trouver d'argument valable contre cela jusqu'à présent:
Arguments (discutables mais non concluants) (de mon point de vue) contre cela jusqu'à présent: (@BalusC et tous les autres: j'aimerais qu'ils soient concluants, mais sinon, ce qui précède peut être vrai et néanmoins les arguments peuvent aider encore le lecteur à obtenir les différences / avantages / inconvénients / mauvaises / bonnes pratiques)
EJB contre Managed Bean
mais:
... ce qui est toujours vrai dans mon cas.
EJB Singleton et Bean de portée d'application
Verrouillage
mais:
(Je ne peux pas voir le marteau ici - désolé ...) Il est bon de connaître les paramètres de verrouillage par défaut (je n'en étais pas au courant), mais cela semble à nouveau incorrect: Oracle Java EE 6 Tutorial on Managing Concurrent Access in a Haricot de session singleton
la source
Habituellement, lorsque vous ne voulez avoir qu'une seule instance d'un objet, vous devriez probablement utiliser l'
@ApplicationScoped
annotation - un tel objet est mandaté et peut donc même être correctement sérialisé prêt à l' emploi .D'un autre côté, il y a aussi de nombreux cas où vous ne voulez qu'une seule instance de la classe, mais une telle classe ne peut pas être mandatée (par exemple parce qu'elle est définitive) - alors
@Singleton
est un sauvetage. CarSingleton
est une pseudo-portée et n'est pas mandatée comme toute portée "normale".la source
@Singleton
dans JSR-299 fait référence aux beans session Singleton (javax.ejb.Singleton
, pasjavax.inject.Singleton
), et non aux beans gérés JSR-299 dans une portée intégrée appelée Singleton.Vous pouvez trouver dans votre serveur
@ApplicationScoped
un par EAR ou un par WAR / EJB-JAR car cela n'est pas clair dans la spécification, mais vous ne devez certainement pas vous attendre à ce qu'il en soit un par JVM.la source
Il y a une autre différence: le
@Singleton
bean ne définit pas les annotations, car laSingleton
portée n'est pas une portée normale. Ensuite, le@ApplicationScoped
bean définit les annotations.Avec la spécification CDI 1.1: lorsque l'application en mode découverte = annotée, Weld n'identifie pas les beans avec
@Singleton
et ne les charge pasla source
L'une des principales différences que vous pouvez écrire dans votre classe avec le constructeur par défaut a un modificateur d'accès privé lors de l'utilisation
javax.inject.Singleton
, mais votre classe doit avoir un constructeur par défaut avec au moins un modificateur d'accès par défaut lors de l'utilisationjavax.enterprise.context.ApplicationScoped
et c'est l'JBOSS 6.1 GA Final
implémentationla source