web-dev-qa-db-fra.com

Différence entre les annotations @Named et @ManagedBean dans JSF2.0 Tomcat7

Cela pourrait être une question noob, mais dans de nombreux tutoriels et exemples, j'ai vu ces annotations utilisées comme si elles faisaient la même chose.

Cependant, je suis tombé sur certaines limitations en utilisant le @Named one (en particulier avec l'injection de dépendances, etc.) Je n'ai pas pu trouver de source où la différence est expliquée et je serais très reconnaissant si quelqu'un pouvait donner un aperçu approximatif du moment d'utiliser l'un ou l'autre.

24
user871784

@Named donne à un bean géré CDI un nom EL à utiliser dans des technologies d'affichage telles que JSF ou JSP. Notez que dans une application CDI, vous n'avez pas besoin du @Named annotation pour faire un bean géré par CDI (merci à @Karl pour son commentaire).

@ManagedBean rend le bean géré par JSF et vous pouvez:

  • l'injecter dans d'autres beans annotés @ManagedBean (mais pas dans les beans @Named!)
  • accédez-y depuis vos vues via le langage d'expression

Voir ceci question connexe pour plus d'informations sur le fonctionnement de l'injection entre les deux types de beans.

Notez qu'il existe également une différence avec la portée des beans. Ils proviennent de différents packages mais portent un nom identique (JSF: javax.faces.bean, CDI: javax.enterprise.context, c'est donc souvent une source d'erreur et de confusion si vous incluez la mauvaise classe.

D'après mon expérience: vous devez utiliser les beans CDI autant que possible car ils sont plus flexibles que les beans gérés JSF. Le seul inconvénient est que CDI ne connaît pas l'étendue de la vue, vous devez donc revenir à @ManagedBean ou utiliser une extension tierce comme Seam.

41
Matt Handy