Utilice CDI.
Según JSF 2.3, @ManagedBean
está en desuso . Consulte también el número de especificaciones 1417 . Esto significa que no hay más de una razón para elegir @ManagedBean
más @Named
. Esto se implementó por primera vez en Mojarra 2.3.0 versión beta m06.
Historia
La diferencia principal es que @ManagedBean
está administrado por el marco JSF y solo está @ManagedProperty
disponible para otros beans administrados por JSF. @Named
es administrado por el servidor de aplicaciones (el contenedor) a través de marco CDI y está vía @Inject
disponible para cualquier tipo de artefacto gestionadas por contenedor como @WebListener
, @WebFilter
, @WebServlet
, @Path
, @Stateless
, etc, e incluso una JSF @ManagedBean
. Desde el otro lado en, @ManagedProperty
no no trabajar dentro de una@Named
o de cualquier otro artefacto logrado contenedor. Funciona realmente solo por dentro@ManagedBean
.
Otra diferencia es que CDI en realidad inyecta proxies que se delegan en la instancia actual en el alcance de destino por solicitud / hilo (como en la forma en que se inyectan los EJB). Este mecanismo permite inyectar un bean de alcance más estrecho en un bean de alcance más amplio, lo que no es posible con JSF @ManagedProperty
. JSF "inyecta" aquí la instancia física directamente al invocar a un establecedor (esa es exactamente la razón por la que se requiere un establecedor, mientras que no se requiere con@Inject
).
Si bien no es directamente una desventaja, hay otras formas, el alcance @ManagedBean
es simplemente limitado. Desde la otra perspectiva, si no desea exponer "demasiado" @Inject
, también puede mantener sus beans administrados @ManagedBean
. Es como protected
versuspublic
. Pero eso realmente no cuenta.
Al menos, en JSF 2.0 / 2.1, la principal desventaja de administrar beans de respaldo JSF por CDI es que no hay un equivalente CDI de @ViewScoped
. Se @ConversationScoped
acerca, pero aún requiere iniciar y detener manualmente y agrega un cid
parámetro de solicitud feo a las URL de resultado. MyFaces CODI lo hace más fácil al unir de forma totalmente transparente JSF javax.faces.bean.ViewScoped
a CDI para que pueda hacerlo @Named @ViewScoped
, sin embargo, eso agrega un windowId
parámetro de solicitud feo a las URL de resultados, también en la navegación simple de página a página. OmniFaces resuelve todo esto con un verdadero CDI @ViewScoped
que realmente vincula el alcance del bean al estado de la vista JSF en lugar de a un parámetro de solicitud arbitrario.
JSF 2.2 (que se publica 3 años después de esta pregunta / respuesta) ofrece una nueva @ViewScoped
anotación totalmente compatible con CDI lista para usar en formato javax.faces.view.ViewScoped
. JSF 2.2 incluso viene con un CDI solo @FlowScoped
que no tiene @ManagedBean
equivalente, lo que empuja a los usuarios de JSF hacia CDI. La expectativa es que @ManagedBean
y los amigos quedarán obsoletos según Java EE 8. Si todavía lo está utilizando @ManagedBean
, se recomienda encarecidamente que cambie a CDI para estar preparado para futuras rutas de actualización. CDI está disponible en contenedores compatibles con Java EE Web Profile, como WildFly, TomEE y GlassFish. Para Tomcat, debe instalarlo por separado, exactamente como ya lo hizo para JSF. Consulte también ¿Cómo instalar CDI en Tomcat?