No CDI existe o pseudo-escopo @ApplicationScoped
e o ( javax.inject
) @Singleton
. Qual a diferença entre eles? Além do fato de que @ApplicationScoped
é procurado, e @Singleton
não é.
Posso apenas mudar meu @Singleton
feijão para @ApplicationScoped
? O @ApplicationScoped
bean pode ter duas (ou mais) instâncias?
@ApplicationScoped
e@Singleton
em sua seção 5.4 (p. 36).Respostas:
@Singleton
não faz parte da especificação CDI. Faz parte do EJB ejavax.inject
(JSR-330). Não é mencionado na especificação qual é o seu comportamento, então você só pode confiar no que está escrito na documentação do Weld.fonte
@Singleton
. É mostrado em apenas um exemplo, sem esclarecimentos. É verdade que o CDI dependejavax.inject
, mas, estritamente falando, não faz parte das especificações do CDI. Dito isso, corrigi um pouco minha resposta.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:
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
mas:
... o que ainda é verdade no meu caso.
Singleton EJB vs. Bean com escopo de aplicativo
Trancando
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
fonte
Normalmente, quando você deseja ter apenas uma instância de algum objeto, você provavelmente deve usar a
@ApplicationScoped
anotação - tal objeto é proxy e, portanto, pode até ser serializado corretamente fora da caixa.Por outro lado, também há muitos casos em que você deseja apenas uma instância da classe, mas essa classe não pode ser representada por proxy (por exemplo, por ser final) - então
@Singleton
é um resgate. PorqueSingleton
é um pseudo-escopo e não está sendo proxy como qualquer escopo "normal".fonte
@Singleton
em JSR-299 refere-se a beans de sessão Singleton (javax.ejb.Singleton
e nãojavax.inject.Singleton
), não a beans gerenciados JSR-299 em um escopo integrado chamado Singleton.Você pode descobrir em seu servidor que
@ApplicationScoped
é um por EAR ou um por WAR / EJB-JAR, pois não está claro na especificação, mas definitivamente não deve esperar que seja um por JVM.fonte
Há mais uma diferença:
@Singleton
não é um bean definindo anotações, pois oSingleton
escopo não é um escopo normal. Então, o@ApplicationScoped
bean define as anotações.Com a especificação CDI 1.1: Quando o aplicativo está no modo de descoberta = anotado, o Weld não identifica os beans com
@Singleton
e não carrega estefonte
Uma das principais diferenças que você pode escrever sua classe com o construtor padrão tem um modificador de acesso privado ao usar
javax.inject.Singleton
, mas sua classe deve ter um construtor padrão com pelo menos o modificador de acesso padrão ao usarjavax.enterprise.context.ApplicationScoped
e esta é aJBOSS 6.1 GA Final
implementaçãofonte