使用CDI。
根据JSF 2.3,@ManagedBean已弃用。另请参阅规格问题1417。这意味着,有没有再一个理由去选择@ManagedBean了@Named。这首先在Mojarra 2.3.0 beta版m06中实现。

历史
核心区别在于,它@ManagedBean是由JSF框架管理的,并且只能通过@ManagedProperty另一个JSF管理的bean使用。@Named通过经由CDI框架应用服务器(容器)经由管理并且@Inject提供给任何种类等的容器管理伪影@WebListener,@WebFilter,@WebServlet,@Path,@Stateless,等,甚至JSF@ManagedBean。从另一边,@ManagedProperty也没有内部的工作@Named或任何其他容器管理的神器。它实际上仅在内部起作用@ManagedBean。
另一个区别是,CDI实际上是在每个请求/线程的基础上,将代表当前实例的代理注入目标范围(例如,如何注入EJB)。这种机制允许将范围更窄的bean注入范围更广的bean中,而JSF则无法实现@ManagedProperty。JSF“内喷射”在这里通过调用setter方法(这也正是为什么需要一个二传手,而直接物理实例不与要求@Inject)。
虽然不是直接不利,但还有其他方法,但范围@ManagedBean却很有限。从另一个角度看,如果您不想公开太多@Inject,也可以只保留托管bean @ManagedBean。就像protectedvs 一样public。但这并不真正重要。
至少在JSF 2.0 / 2.1中,通过CDI管理JSF支持bean的主要缺点是没有与之等效的CDI @ViewScoped。这很@ConversationScoped接近,但是仍然需要手动启动和停止,并且它将丑陋的cid请求参数附加到结果URL。MyFaces CODI通过将JSF完全透明地桥javax.faces.bean.ViewScoped接到CDI 变得更容易,因此您可以进行操作@Named @ViewScoped,但是,windowId在普通的逐页导航中,也将丑陋的请求参数附加到结果URL。OmniFaces用真正的CDI解决了所有这些问题,@ViewScoped它实际上将bean的作用域与JSF视图状态联系在一起,而不是与任意请求参数联系在一起。
JSF 2.2(在此问题/答案发布三年后发布)以的形式提供了一个新的,完全兼容CDI的@ViewScoped注释javax.faces.view.ViewScoped。JSF 2.2,即使有CDI-只走来@FlowScoped不具有@ManagedBean同等学历,在此推动JSF用户对CDI。期望@ManagedBean按照Java EE 8的规定,不推荐使用和朋友。如果您当前仍在使用@ManagedBean,那么强烈建议您切换到CDI,为将来的升级路径做准备。CDI可以在Java EE Web Profile兼容的容器中轻松获得,例如WildFly,TomEE和GlassFish。对于Tomcat,必须完全像对JSF那样单独安装。另请参阅如何在Tomcat中安装CDI?