gpt4 book ai didi

jsf - 支持 Bean (@ManagedBean) 还是 CDI Bean (@Named)?

转载 作者:行者123 更新时间:2023-12-03 04:43:39 27 4
gpt4 key购买 nike

我刚刚开始阅读 Core JavaServer Faces, 3rd Ed.他们这样说(强调我的):

It is a historical accident that there are two separate mechanisms, CDI beans and JSF managed beans, for beans that can be used in JSF pages. We suggest that you use CDI beans unless your application must work on a plain servlet runner such as Tomcat.

为什么?他们没有提供 任何理由。我一直在 GlassFish 3 上运行的原型(prototype)应用程序中使用 @ManagedBean 来处理所有 bean,但我并没有真正注意到这方面的任何问题。我并不特别介意从 @ManagedBean 迁移到 @Named,但我想知道 为什么我应该麻烦

最佳答案

使用 CDI。

根据 JSF 2.3,@ManagedBean弃用。另请参阅spec issue 1417 。这意味着不再有理由选择 @ManagedBean 而不是 @Named。这首先在 Mojarra 2.3.0 beta 版本 m06 中实现。

enter image description here

自 Faces 4.0 起,@ManagedBean 已按照规范 issue 1547 删除 .

<小时/>

历史记录

核心区别是 @ManagedBean由 JSF 框架管理,只能通过 @ManagedProperty可用于另一个 JSF 托管 bean。 @Named由应用程序服务器(容器)通过 CDI 框架进行管理,并通过 @Inject可用于任何类型的容器管理工件,例如 @WebListener@WebFilter@WebServlet@Path@Stateless 等,甚至是 JSF @ManagedBean。从另一方面来看,@ManagedProperty 不能@Named 或任何其他容器管理的工件内工作。它实际上只在 @ManagedBean 内部工作。

另一个区别是,CDI 实际上会在每个请求/线程的基础上注入(inject)委托(delegate)给目标范围中当前实例的代理(就像 EJB 的注入(inject)方式一样)。此机制允许在范围较广的 bean 中注入(inject)范围较窄的 bean,而这对于 JSF @ManagedProperty 来说是不可能的。 JSF 在这里通过调用 setter 直接“注入(inject)”物理实例(这也正是需要 setter 的原因,而 @Inject不需要)。

虽然不是直接的缺点(还有其他方法),但 @ManagedBean 的范围只是有限的。从另一个角度来看,如果您不想为 @Inject 暴露“太多”,您也可以只保留托管 bean @ManagedBean。这就像 protected 公共(public)。但这并不算什么。

至少,在 JSF 2.0/2.1 中,通过 CDI 管理 JSF 支持 Bean 的主要缺点是没有与 @ViewScoped 等效的 CDI。 @ConversationScoped 很接近,但仍然需要手动启动和停止,并且它会向结果 URL 附加一个丑陋的 cid 请求参数。 MyFaces CODI 通过完全透明地将 JSF 的 javax.faces.bean.ViewScoped 桥接到 CDI,使事情变得更容易,这样您就可以执行 @Named @ViewScoped,但这会附加一个难看的 windowId 请求参数到结果 URL,也适用于普通的页面到页面导航。 OmniFaces通过真正的 CDI @ViewScoped 解决了这一切这确实将 bean 的范围与 JSF View 状态联系起来,而不是与任意请求参数联系起来。

JSF 2.2(在这个问题/答案 3 年后发布)提供了一个新的完全兼容 CDI 的 @ViewScoped 注释,具有 javax.faces.view.ViewScoped< 的风格。/。 JSF 2.2 甚至附带了仅 CDI 的 @FlowScoped,它没有等效的 @ManagedBean,从而将 JSF 用户推向 CDI。预计 @ManagedBean 及其相关元素将根据 Java EE 8 被弃用。如果您当前仍在使用 @ManagedBean,那么强烈建议您切换到 CDI为 future 的升级路径做好准备。 CDI 很容易在 Java EE Web Profile 兼容容器中使用,例如 WildFly、TomEE 和 GlassFish。对于 Tomcat,您必须单独安装它,就像您对 JSF 所做的那样。另请参阅How to install CDI in Tomcat?

关于jsf - 支持 Bean (@ManagedBean) 还是 CDI Bean (@Named)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4347374/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com