Differenza tra annotazioni @Named e @ManagedBean in JSF2.0 Tomcat7

Questa potrebbe essere una domanda noob, tuttavia in molti tutorial ed esempi ho visto queste annotazioni usate come se facessero la stessa cosa.

Tuttavia mi sono imbattuto in alcune limitazioni usando @Named (specialmente con l’ @Named dipendenze, ecc.) Non sono riuscito a trovare una fonte in cui è spiegata la differenza e sarei molto grato se qualcuno potesse dare una panoramica generale su quando usarne una o l’altro.

@Named fornisce a un bean gestito CDI un nome EL da utilizzare nelle tecnologie di visualizzazione come JSF o JSP. Nota che in un’applicazione CDI non hai bisogno dell’annotazione @Named per creare un bean gestito da CDI (grazie a @Karl per il suo commento).

@ManagedBean rende il bean gestito da JSF e puoi:

  • iniettarlo in altri bean con annotazione @ManagedBean (ma non nei bean @Named!)
  • accedervi dalle vostre visualizzazioni tramite il linguaggio delle espressioni

Vedi questa domanda correlata per ulteriori informazioni su come funziona l’iniezione tra entrambi i tipi di fagioli.

Si noti che esiste anche una differenza con l’ambito dei bean. Vengono da pacchetti diversi ma sono identificati in modo identico (JSF: javax.faces.bean , CDI: javax.enterprise.context , quindi è spesso una fonte di errore e confusione se si include la class sbagliata.

Dalla mia esperienza: dovresti utilizzare i bean CDI quando ansible, dato che sono più flessibili dei bean gestiti da JSF. Unico svantaggio è che CDI non conosce un ambito di visualizzazione, quindi è necessario tornare a @ManagedBean o utilizzare alcune estensioni di terze parti come Seam.