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:
Dans de nombreux scénarios / configurations de la vie réelle, je dirais qu'il est difficile de dire avec certitude - d'un point de vue abstrait / modélisation - si quelque chose est (ou deviendra / sera traité comme) un EJB ou un bean géré à portée d'application.
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
BalusC : C'est un EJB pas un bean géré, ce qui est assez différent. Les EJB s'exécutent en backend et les beans gérés en frontend. Les EJB fonctionnent également dans un contexte transactionnel. [...] Vous venez de confondre les beans enterprise avec les beans gérés et je viens de le souligner.
mais:
moi : Je pense que vous n'êtes pas tout à fait correct et surestimez le sens / l'utilisation et cela me semble discutable. http://en.wikipedia.org/wiki/Enterprise_JavaBeans
Enterprise JavaBeans (EJB) est un logiciel serveur géré pour la construction modulaire de logiciels d'entreprise et l'une des nombreuses API Java. EJB est un composant logiciel côté serveur qui encapsule la logique métier d'une application.
Types de beans entreprise
Session Beans [3] qui peut être "Stateful", "Stateless" ou "Singleton" [...]
Beans pilotés par message [...]
... ce qui est toujours vrai dans mon cas.
EJB Singleton et Bean de portée d'application
Verrouillage
BalusC : Un EJB singleton n'est pas la même chose qu'un bean de portée d'application. Un EJB singleton est verrouillé en lecture / écriture et donc potentiellement inefficace / surconvolué pour la tâche que vous aviez en tête. En bref: prenez un bon livre sur Java EE et apprenez à utiliser le bon outil pour le travail. Une façon n'est certainement pas l'autre. Que cela fonctionne ne signifie pas que c'est le bon outil. Une masse est capable de fixer une vis, mais ce n'est pas forcément le bon outil pour cela :)
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
Lors de la création d'un bean session singleton, l'accès simultané aux méthodes métier du singleton peut être contrôlé de deux manières: la concurrence gérée par le conteneur et la concurrence gérée par le bean. [...]
Bien que par défaut, les singletons utilisent la concurrence gérée par le conteneur, l'annotation @ConcurrencyManagement (CONTAINER) peut être ajoutée au niveau de la classe du singleton pour définir explicitement le type de gestion de la concurrence.
@ApplicationScoped
et@Singleton
à sa section 5.4 (p. 36).