La principale différence est, @ManagedBean
est géré par JSF cadre et est uniquement par le biais d' @ManagedProperty
disponible à l'autre JSF géré les haricots. @Named
est géré par le serveur d'application (le conteneur) via CDI cadre et à l'est par l'intermédiaire d' @Inject
disponible pour tout type de conteneur géré artefact comme @WebListener
, @WebFilter
, @WebServlet
, @Path
, @Stateless
,, etc et même un JSF @ManagedBean
. De l'autre côté, sur, @ManagedProperty
ne pas travailler à l'intérieur d'un @Named
ou tout autre conteneur géré artefact. Il fonctionne vraiment seulement à l'intérieur d' @ManagedBean
.
Une autre différence est que le CDI fait injecte de procurations de déléguer à l'instance actuelle de la cible portée par la demande/thread (comme la façon dont les Ejb sont injectés). Ce mécanisme permet l'injection d'un bean d'un champ d'application plus restreint dans un bean d'un champ d'application plus large, ce qui n'est pas possible avec la JSF @ManagedProperty
. JSF "injecte" ici le physique de l'instance directement en invoquant un setter (qui est aussi exactement pourquoi un setter est nécessaire, alors que c'est pas nécessaire avec @Inject
).
Bien que pas directement un inconvénient — il existe d'autres moyens — le champ d'application de l' @ManagedBean
est simplement limitée. De l'autre point de vue, si vous ne voulez pas exposer "trop" pour @Inject
, vous pouvez aussi garder vos haricots @ManagedBean
. C'est comme protected
contre public
. Mais cela ne compte pas vraiment.
Au moins, en JSF 2.0/2.1, l'inconvénient majeur de la gestion de la JSF sauvegarde des grains par le CDI est qu'il n'y a pas de CDI équivalent de @ViewScoped
. L' @ConversationScoped
vient de fermer, mais qui nécessite encore manuellement le démarrage et l'arrêt, et il ajoute un vilain cid
demande de paramètre pour résultat d'Url. MyFaces CODI vous facilite la tâche en entièrement transparente de transition JSF de l' javax.faces.bean.ViewScoped
de CDI, de sorte que vous pouvez juste faire @Named @ViewScoped
, mais qui ajoute un vilain windowId
demande de paramètre pour résultat Url, également sur la plaine de vanille page-à-page de navigation. OmniFaces résout tout cela avec un vrai CDI @ViewScoped
qui vraiment des liens de la fève de portée de vue JSF état et non à l'arbitraire d'un paramètre de la requête.
JSF 2.2 (qui est sorti 3 ans après cette question/réponse) propose un CDI compatibles @ViewScoped
d'annotation sorti de la boîte dans la saveur de l' javax.faces.view.ViewScoped
. JSF 2.2 vient même avec un CDI-seulement @FlowScoped
qui n'ont pas d' @ManagedBean
équivalent, par les présentes, en poussant JSF utilisateurs vers CDI. L'espoir est que, @ManagedBean
et les amis seront supprimées que par Java EE 8. Si vous êtes actuellement toujours à l'aide d' @ManagedBean
, il est donc fortement recommander pour passer en CDI pour être prêt pour les futures chemins de mise à niveau. Le CDI est facilement disponible dans Java EE Web compatible avec Profil de récipients, tels que des Wilfdly, TomEE et GlassFish. Pour Tomcat, vous devez l'installer séparément, exactement comme vous l'avez déjà fait pour le JSF. Voir aussi Comment installer CDI dans Tomcat?