Usa CDI.
Secondo JSF 2.3, @ManagedBean
è deprecato . Vedere anche il problema delle specifiche 1417 . Questo significa che non c'è più un motivo per scegliere @ManagedBean
sopra @Named
. Questo è stato implementato per la prima volta in Mojarra 2.3.0 versione beta m06.
Storia
La differenza principale è che @ManagedBean
è gestito dal framework JSF ed è @ManagedProperty
disponibile solo tramite un altro bean gestito JSF. @Named
è gestito da server di applicazione (il contenitore) tramite quadro CDI ed è via @Inject
disponibile per qualsiasi tipo di un contenitore artefatto gestita come @WebListener
, @WebFilter
, @WebServlet
, @Path
, @Stateless
, ecc e anche un JSF @ManagedBean
. Dall'altro lato su, @ManagedProperty
non non funzioneranno dentro @Named
o qualsiasi altro contenitore artefatto gestiti. Funziona davvero solo all'interno @ManagedBean
.
Un'altra differenza è che CDI inietta effettivamente i proxy che delegano all'istanza corrente nell'ambito di destinazione in base alla richiesta / thread (come il modo in cui sono stati iniettati gli EJB). Questo meccanismo consente di iniettare un bean di uno scope più ristretto in un bean di uno scope più ampio, cosa che non è possibile con JSF @ManagedProperty
. JSF "inietta" qui l'istanza fisica direttamente invocando un setter (che è anche esattamente il motivo per cui è richiesto un setter, mentre quello non è richiesto con @Inject
).
Sebbene non sia direttamente uno svantaggio - ci sono altri modi - la portata di @ManagedBean
è semplicemente limitata. Dall'altro punto di vista, se non vuoi esporre "troppo" per @Inject
, puoi anche mantenere i tuoi fagioli gestiti @ManagedBean
. È come protected
contro public
. Ma questo non conta davvero.
Almeno, in JSF 2.0 / 2.1, il principale svantaggio della gestione dei backing bean JSF da parte di CDI è che non esiste un equivalente CDI di @ViewScoped
. Si @ConversationScoped
avvicina, ma richiede ancora l'avvio e l'arresto manuali e aggiunge un brutto cid
parametro di richiesta agli URL dei risultati. MyFaces CODI rende tutto più semplice collegando in modo completamente trasparente i JSF javax.faces.bean.ViewScoped
a CDI in modo da poterlo fare @Named @ViewScoped
, tuttavia ciò aggiunge un brutto windowId
parametro di richiesta agli URL dei risultati, anche sulla semplice navigazione da pagina a pagina. OmniFaces risolve tutto questo con un vero CDI @ViewScoped
che lega realmente l'ambito del bean allo stato di visualizzazione JSF invece che a un parametro di richiesta arbitrario.
JSF 2.2 (che viene rilasciato 3 anni dopo questa domanda / risposta) offre una nuova @ViewScoped
annotazione completamente compatibile CDI fuori dagli schemi in sapore di javax.faces.view.ViewScoped
. JSF 2.2 arriva anche con un solo CDI @FlowScoped
che non ha un @ManagedBean
equivalente, spingendo gli utenti JSF verso CDI. L'aspettativa è che gli @ManagedBean
amici saranno deprecati in base a Java EE 8. Se stai ancora utilizzando @ManagedBean
, è quindi fortemente consigliato passare a CDI per essere preparati per futuri percorsi di aggiornamento. CDI è immediatamente disponibile nei contenitori compatibili con Java EE Web Profile, come WildFly, TomEE e GlassFish. Per Tomcat, devi installarlo separatamente, esattamente come hai già fatto per JSF. Vedi anche Come installare CDI in Tomcat?