Jsf 在JavaEE6中@ManagedBeans是否因为CDI/Weld中的@Named而过时?

Jsf 在JavaEE6中@ManagedBeans是否因为CDI/Weld中的@Named而过时?,jsf,jakarta-ee,jsf-2,jboss-weld,Jsf,Jakarta Ee,Jsf 2,Jboss Weld,由于CDI(及其实现),JEE6中的每个POJO都可以用@Named注释,这使得POJO可以访问视图 这是否意味着ManagedBeans现在已经完全过时了? 还是我错过了一些@ManagedBean仍然有意义的地方?正如我刚才在(第12页)中读到的,@ManagedBean现在是超级棒: 您可以显式声明托管 通过注释bean类来创建bean @ManagedBean,但在CDI中您没有 需要。根据 规范,CDI容器 处理满足以下条件的任何类: 以下条件作为托管 豆子: 它不是一个非静态的内部

由于CDI(及其实现),JEE6中的每个POJO都可以用
@Named
注释,这使得POJO可以访问视图

这是否意味着ManagedBeans现在已经完全过时了? 还是我错过了一些
@ManagedBean
仍然有意义的地方?

正如我刚才在(第12页)中读到的,@ManagedBean现在是超级棒:

您可以显式声明托管 通过注释bean类来创建bean @ManagedBean,但在CDI中您没有 需要。根据 规范,CDI容器 处理满足以下条件的任何类: 以下条件作为托管 豆子:

  • 它不是一个非静态的内部类。它是一个具体的类,或者是 注释@Decorator
  • 它没有使用定义注释或注释的EJB组件进行注释 在中声明为EJB bean类 ejb-jar.xml
  • 它没有实现javax.enterprise.inject.spi.Extension
  • 它有一个合适的构造函数:
  • 该类有一个没有参数的构造函数,或者
  • 该类声明了一个带注释的@Inject构造函数

你有选择的余地。使用JSF2中的@ManagedBean将bean绑定到表单中,或者使用CDI中的@Named注释。如果您计划只使用JSF,那么可以使用@ManagedBean,但是如果您想与EJB集成,或者使用CDI的@ConversationScope,那么就使用CDI路线


我个人认为JSF的下一个版本应该反对@ManagedBean,并在CDI上进行标准化。这种二元性让新手感到困惑。

简而言之,
@ManagedBean
对于使用JSF但不使用JSR 299的应用程序来说是有意义的(无论原因是什么)。下面是加文·金的详细解释:

: 在浏览焊接示例和旧的WebBeans时 文档,它看起来像一个 新@ManagedBean JSF的竞争对手 2.0注释。有没有关于我们什么时候使用的信息 一个在另一个之上

这是个好问题,我不是 真的完全同意 到目前为止已经发布的答案

新的EE管理bean规范 定义的基本组件模型 JavaEE,以及一个非常基本的 容器服务集(
@Resource
,,
@PostConstruct
@PreDestroy

我们的想法是,其他规范 (从EJB、CDI、JSF和 新的Java拦截器规范)基于 此基础组件模型和层 例如,其他服务 事务管理,类型安全 依赖注入,拦截器。所以 在这个级别上,托管bean、CDI、, 拦截器和EJB规范 所有的工作都是手拉手的,而且都是高度一致的 补充

现在,托管bean规范 在这方面是非常开放的 确定哪些类是 管理豆。它确实提供了
@ManagedBean
注释为一体 机制,但它也允许其他 规范定义不同的 机制。例如:

  • EJB规范指出,一个类遵循特定的编程规则 无状态的限制或
    @Stateful
    注释部署在 ejbjar是一个托管bean

  • CDI规范指出,任何具有适当构造函数的类 在“bean部署”中部署 “归档”是一个托管bean

鉴于EJB和CDI提供 可以说是更方便的方法 识别一个托管bean,您可以 想知道
@ManagedBean
到底是什么 需要。答案,正如暗指的那样 丹,如果你有CDI的话 在您的环境中可用(用于 例如,如果您使用的是EE6),那么
@ManagedBean
并不是真正的 需要
@ManagedBean
确实存在 供使用JSF2的用户使用 没有CDI

OTOH,如果你对一个bean进行注释
@ManagedBean
,您在 在您的环境中,您仍然可以使用 CDI将东西注入你的豆子。 只是
@ManagedBean
此文档中不需要注释 案例

总之,如果你有CDI 对您可用,它提供了一个 高级编程模型
@ManagedBean
/
@ManagedProperty
模型 JSF2从JSF1继承而来。所以 事实上,EE6网络的优势在于 配置文件不需要对的支持
@ManagedProperty
等。这个想法 你应该用CDI来代替


CDI没有视图作用域,因为它是,所以如果您需要该作用域,纯形式的CDI无法做到这一点。视图范围基本上是指。它不是一个JSF视图,就像一个名为
xyz.xhtml
的页面,尽管您看到的是JSF
等等。视图范围bean的一个常见用例是。还有

请注意,CDI位于EJB/服务层,而不是JSF/表示层。有一个很好的概述

因此,如果您使用的是
@ViewScoped
bean,则不能完全用CDI替换
@ManagedBean
,至少不能不使用或使用。当使用基于AjaxedJSF2的GUI工具包(如RichFaces、PrimeFaces、IceFaces等)时,几乎总是会使用视图范围的bean

在使用RichFaces或类似API时,混合使用错误Java EE 6包的注释可能会让您意外地陷入麻烦:

@javax.faces.bean.ManagedBean
@javax.faces.bean.[Jsf]Scoped
用于表示层中单独使用的组件,这里由RichFaces、PrimeFaces等使用。一些rich组件。如果您的bean(或者看起来什么都不做的bean)出现了奇怪的行为,那么注释的错误组合可能是原因

混合JSF和CDI,比如

@javax.inject.Named
@javax.faces.bean.[Jsf]Scoped
在大多数情况下,当从JSF页面引用时,这是可能的,并且是有效的,但是
@javax.inject.Named
@javax.faces.bean.[Cdi]Scoped
@javax.ejb.*