Use CDI.
De acordo com o JSF 2.3, @ManagedBean
está obsoleto . Consulte também o problema de especificação 1417 . Isto significa que não há mais uma razão para escolher @ManagedBean
mais @Named
. Isso foi implementado pela primeira vez no Mojarra 2.3.0 beta versão m06.
História
A principal diferença é que @ManagedBean
é gerenciado pelo framework JSF e está @ManagedProperty
disponível apenas para outros beans gerenciados JSF. @Named
é gerido pelo servidor de aplicativos (o recipiente) via quadro CDI e é via @Inject
disponível para qualquer tipo de recipiente artefato gerido como @WebListener
, @WebFilter
, @WebServlet
, @Path
, @Stateless
, etc e até mesmo um JSF @ManagedBean
. Do outro lado, @ManagedProperty
se não trabalhar dentro de uma @Named
ou qualquer outro recipiente artefato gerenciado. Funciona realmente apenas por dentro @ManagedBean
.
Outra diferença é que o CDI realmente injeta proxies que delegam à instância atual no escopo de destino por solicitação / thread (por exemplo, como os EJBs são injetados). Esse mecanismo permite injetar um bean de escopo mais restrito em um bean de escopo mais amplo, o que não é possível com JSF @ManagedProperty
. O JSF "injeta" aqui a instância física diretamente chamando um setter (é exatamente por isso que um setter é necessário, embora não seja necessário com @Inject
).
Embora não seja uma desvantagem direta - existem outras maneiras - o escopo do @ManagedBean
é simplesmente limitado. Da outra perspectiva, se você não quiser expor "demais" para @Inject
, também pode apenas manter seus beans gerenciados @ManagedBean
. É como protected
versus public
. Mas isso realmente não conta.
Pelo menos, no JSF 2.0 / 2.1, a principal desvantagem de gerenciar beans de apoio JSF por CDI é que não há equivalente de CDI @ViewScoped
. O @ConversationScoped
chega perto, mas ainda requer iniciar e parar manualmente e anexar um cid
parâmetro de solicitação feio aos URLs resultantes. MyFaces CODI torna isso mais fácil, conectando JSFs javax.faces.bean.ViewScoped
a CDI de forma totalmente transparente, de modo que você possa simplesmente fazer @Named @ViewScoped
, no entanto, isso anexa um windowId
parâmetro de solicitação feio a URLs resultantes, também na navegação simples de página a página. OmniFaces resolve tudo isso com um verdadeiro CDI @ViewScoped
que realmente vincula o escopo do bean ao estado de exibição JSF em vez de a um parâmetro de solicitação arbitrário.
JSF 2.2 (que é lançado 3 anos após esta pergunta / resposta) oferece uma nova @ViewScoped
anotação totalmente compatível com CDI fora da caixa no sabor de javax.faces.view.ViewScoped
. O JSF 2.2 vem com um CDI apenas @FlowScoped
que não tem um @ManagedBean
equivalente, empurrando os usuários do JSF para o CDI. A expectativa é que @ManagedBean
e amigos sejam descontinuados de acordo com o Java EE 8. Se você ainda estiver usando @ManagedBean
, é altamente recomendável mudar para o CDI para estar preparado para caminhos de atualização futuros. O CDI está disponível em containers compatíveis com o Java EE Web Profile, como WildFly, TomEE e GlassFish. Para o Tomcat, você deve instalá-lo separadamente, exatamente como já fez para o JSF. Veja também Como instalar o CDI no Tomcat?