Resumindo: você pode até misturar ( @Singleton
e @ApplicationScoped
) e faz sentido em alguns cenários.
(e funciona conforme o esperado no meu!)
Além das outras respostas até agora, gostaria de adicionar mais alguns pontos para esclarecimento em cenários do mundo real.
Para mim, esta questão foi desenvolvida a partir de Como faço para forçar um bean com escopo de aplicativo a instanciar na inicialização do aplicativo?
Em alguma discussão lá eu afirmei isso e não consigo encontrar um argumento válido contra isso até agora:
Em muitos cenários / configurações da vida real, eu diria que é difícil dizer definitivamente - de um ponto de vista abstrato / de modelagem - se algo é (ou se tornará / será tratado como) um EJB ou um bean gerenciado com escopo de aplicativo.
argumentos (discutíveis, mas não conclusivos) (do meu ponto de vista) contra isso até agora: (@BalusC e todos os outros: eu gostaria de vê-los sendo conclusivos, mas se não, o acima pode ser verdadeiro e, no entanto, os argumentos podem ainda ajuda o leitor a entender as diferenças / vantagens / desvantagens / más / boas práticas)
EJB vs. Managed Bean
BalusC : Esse é um EJB, não um bean gerenciado, o que é bem diferente. Os EJBs são executados no back-end e os beans gerenciados no front-end. Os EJBs também são executados no contexto transacional. [...] Você acabou de confundir enterprise beans com managed beans e eu apenas apontei isso.
mas:
eu : Acho que você não está totalmente correto e exagerando o significado / uso e isso me parece questionável. http://en.wikipedia.org/wiki/Enterprise_JavaBeans
Enterprise JavaBeans (EJB) é um software de servidor gerenciado para construção modular de software corporativo e uma das várias APIs Java. EJB é um componente de software do lado do servidor que encapsula a lógica de negócios de um aplicativo.
Tipos de Enterprise Beans
Beans de sessão [3] que podem ser "Stateful", "Stateless" ou "Singleton" [...]
Feijões movidos por mensagem [...]
... o que ainda é verdade no meu caso.
Singleton EJB vs. Bean com escopo de aplicativo
Trancando
BalusC : Um EJB singleton não é o mesmo que um bean com escopo de aplicativo. Um EJB singleton é bloqueado para leitura / gravação e, portanto, potencialmente ineficiente / superconvoluído para a tarefa que você tinha em mente. Resumindo: pegue um bom livro Java EE e aprenda a usar a ferramenta certa para o trabalho. Uma maneira definitivamente não é a outra. O fato de funcionar não significa que seja a ferramenta certa. Uma marreta é capaz de prender um parafuso, mas não é necessariamente a ferramenta certa para isso :)
mas:
(Não consigo ver a marreta aqui - desculpe ...) É bom saber os padrões de bloqueio (eu não estava ciente disso), mas isso parece estar incorreto novamente: Tutorial do Oracle Java EE 6 sobre gerenciamento de acesso simultâneo em um Feijão de Sessão Singleton
Ao criar um único bean de sessão, o acesso simultâneo aos métodos de negócios do singleton pode ser controlado de duas maneiras: simultaneidade gerenciada por contêiner e simultânea gerenciada por bean. [...]
Embora, por padrão, os singletons usem simultaneidade gerenciada por contêiner, a anotação @ConcurrencyManagement (CONTAINER) pode ser adicionada no nível de classe do singleton para definir explicitamente o tipo de gerenciamento de simultaneidade
@ApplicationScoped
e@Singleton
em sua seção 5.4 (p. 36).