Utilisez CDI.
Selon JSF 2.3, @ManagedBean
est obsolète . Voir également le numéro de spécification 1417 . Cela signifie que il n'y a pas plus d' une raison de choisir @ManagedBean
plus @Named
. Cela a été implémenté pour la première fois dans la version bêta de Mojarra 2.3.0 m06.
L'histoire
La principale différence est qu'elle @ManagedBean
est gérée par le framework JSF et n'est @ManagedProperty
disponible que via un autre beans gérés JSF. @Named
est géré par le serveur d'application (le conteneur) via le framework CDI et est @Inject
disponible pour tout type d'artefact géré par conteneur comme @WebListener
,@WebFilter
, @WebServlet
, @Path
, @Stateless
, etc. et même un JSF @ManagedBean
. De l'autre côté, @ManagedProperty
ne fonctionne pas dans un @Named
ou tout autre artefact géré par conteneur. Cela ne fonctionne vraiment qu'à l'intérieur @ManagedBean
.
Une autre différence est que CDI injecte en fait des proxys déléguant à l'instance actuelle dans la portée cible sur une base par requête / thread (comme la façon dont les EJB sont injectés). Ce mécanisme permet d'injecter un bean de portée plus étroite dans un bean de portée plus large, ce qui n'est pas possible avec JSF @ManagedProperty
. JSF "injecte" ici l'instance physique directement en invoquant un setter (c'est aussi exactement pourquoi un setter est nécessaire, alors que ce n'est pas obligatoire avec @Inject
).
Bien que ce ne soit pas directement un inconvénient - il existe d'autres moyens - la portée de @ManagedBean
est simplement limitée. D'un autre point de vue, si vous ne voulez pas exposer "trop" pour @Inject
, vous pouvez aussi simplement conserver vos beans gérés @ManagedBean
. C'est comme protected
contre public
. Mais cela ne compte pas vraiment.
Au moins, dans JSF 2.0 / 2.1, le principal inconvénient de la gestion des backing beans JSF par CDI est qu'il n'y a pas d'équivalent CDI de @ViewScoped
. Le @ConversationScoped
se rapproche, mais nécessite toujours un démarrage et un arrêt manuels et ajoute un cid
paramètre de demande laid aux URL de résultat. MyFaces CODI facilite les choses en reliant de manière totalement transparente les JSF javax.faces.bean.ViewScoped
à CDI afin que vous puissiez simplement le faire @Named @ViewScoped
, mais cela ajoute un vilainwindowId
paramètre de requête aux URL de résultat, également sur la navigation simple de page à page. OmniFaces résout tout cela avec un vrai CDI @ViewScoped
qui lie vraiment la portée du bean à l'état de vue JSF plutôt qu'à un paramètre de requête arbitraire.
JSF 2.2 (qui sort 3 ans après cette question / réponse) offre une nouvelle @ViewScoped
annotation entièrement compatible CDI prête à l'emploi dans la saveur de javax.faces.view.ViewScoped
. JSF 2.2 est même livré avec un CDI uniquement @FlowScoped
qui n'a pas d' @ManagedBean
équivalent, poussant ainsi les utilisateurs JSF vers CDI. On s'attend à ce que les @ManagedBean
amis soient obsolètes selon Java EE 8. Si vous l'utilisez toujours @ManagedBean
, il est donc fortement recommandé de passer à CDI pour être préparé aux futurs chemins de mise à niveau. CDI est facilement disponible dans des conteneurs compatibles Java EE Web Profile, tels que WildFly, TomEE et GlassFish. Pour Tomcat, vous devez l'installer séparément, exactement comme vous l'avez déjà fait pour JSF. Voir aussi Comment installer CDI dans Tomcat?