使用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
。就像protected
vs 一样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?