108 votes

Sauvegarde de beans (@ManagedBean) ou de CDI Beans (@Named)?

Je viens de commencer la lecture par le biais de Base de JavaServer Faces, 3ème Ed. et ils disent que c' (l'emphase est mienne):

C'est un accident historique qu'il y a deux mécanismes distincts, CDI haricots et JSF géré les haricots, les haricots qui peuvent être utilisés dans les pages JSF. Nous vous suggérons de que vous utilisez CDI haricots à moins que votre application doit fonctionner sur une simple servlet coureur comme Tomcat.

Pourquoi? Ils ne donnent pas de toute justification. J'ai été en utilisant @ManagedBean pour tous les haricots dans un prototype d'application en cours d'exécution sur GlassFish 3, et je n'ai pas vraiment remarqué des problèmes avec cette. Je n'ai pas particulièrement l'esprit de la migration de @ManagedBean de @Named, mais je veux savoir pourquoi je devrais.

168voto

BalusC Points 498232

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?

63voto

Bozho Points 273663

CDI est préférable au JSF brut car CDI permet l’injection de dépendances à l’échelle de JavaEE. Vous pouvez également injecter des POJO et les gérer. Avec JSF, vous ne pouvez injecter qu'un sous-ensemble de ce que vous pouvez avec CDI.

15voto

h2mch Points 316

Avec Java EE 6 et CDI vous avez l'option différente pour les Haricots

  • @javax.faces.bean.ManagedBean se reporter à la JSR 314 et a été introduit avec la JSF 2.0. L'objectif principal était d'éviter la configuration dans le faces-config.xml le fichier à utiliser la fève à l'intérieur d'une Page JSF.
  • @javax.annotation.ManagedBean("myBean") est défini par la JSR 316. Elle généralise la JSF géré de haricots pour les utiliser ailleurs dans Java EE
  • @javax.inject.Named("myBean") sont presque les mêmes, en tant que l'un des ci-dessus, sauf que vous avez besoin d'un beans.xml fichier dans le web/WEB-INF Dossier activer CDI.

2voto

AlanObject Points 2199

J'ai été en utilisant CDI dans GlassFish 3.0.1, mais pour le faire fonctionner, j'ai dû importer de la Couture 3-cadre (Soudure). Cela a fonctionné assez bien.

Dans GlassFish 3.1 CDI cessé de travailler, et le joint de Soudure arrêté de travailler avec elle. J'ai ouvert un bug sur ce mais ne l'avez pas vu encore fixée. J'ai dû convertir tout mon code à l'aide de la javax.des visages.* les annotations, mais j'ai l'intention de revenir au CDI une fois qu'ils obtenir ce travail.

Je suis d'accord vous devez utiliser le CDI, mais un problème que je n'ai pas vu encore résolue est de savoir quoi faire avec le @ViewScoped annotation. J'ai beaucoup de code qui en dépend. Il n'est pas clair si @ViewScoped fonctionne si vous n'êtes pas à l'aide de @ManagedBean. Si quelqu'un peut clarifier ce que je l'apprécierais.

0voto

wrschneider99 Points 5119

Une bonne raison d'aller au CDI: vous pourriez avoir une session commune dont l'étendue des ressources (profil utilisateur par exemple) @Injecter de l'ed dans les deux JSF géré fèves de REPOS et de services (c'est à dire, Jersey/JAX-RS).

D'autre part, @ViewScoped est une raison impérieuse de bâton avec la JSF @ManagedBean - en particulier pour quoi que ce soit avec d'importantes AJAX. Il n'existe aucune norme de remplacement pour cette en CDI.

Couture peut avoir un certain appui pour une @ViewScoped-comme annotation pour les CDI, les haricots, mais je n'ai pas joué avec lui personnellement.

http://seamframework.org/Seam3/FacesModule

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X