由于CDI / Weld中的@Named,JavaEE6中的@ManagedBeans是否已过时?

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

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

简而言之,@ @ManagedBean对于使用JSF但不使用JSR 299的应用程序是有意义的(无论原因是什么)。 在Gavin King的较长解释之下:

回复:在JSF2中比较@ManagedBean注释? :

在查看Weld示例和较早的WebBeans文档时,它看起来像新的@ManagedBean JSF 2.0注释的竞争对手。 有什么信息表明我们什么时候想要使用一个吗?

这是一个很好的问题,我并不完全同意迄今为止发布的答案。

新的EE Managed Beans规范定义了Java EE的基本组件模型,以及一组非常基本的容器服务( @Resource ,@ @PostConstruct ,@ @PreDestroy )。

其思想是,其他规范(以EJB,CDI,JSF和新的Java拦截器规范开始)build立在此基本组件模型和层附加服务上,例如事务pipe理,types安全dependency injection,拦截器。 因此,在这个层面上,托pipe的bean,CDI,拦截器和EJB规范都是相辅相成的。

现在,Managed Beans规范对于确切地识别哪些类是托pipe的bean来说是相当开放的。 它提供了@ManagedBean注解作为一种机制,但它也允许其他规范定义不同的机制。 所以,例如:

  • EJB规范指出,一个服从EJB jar中部署的@Stateless@Stateful注释的某些编程限制的类是一个托pipebean。

  • CDI规范说,任何具有在“bean部署档案”中部署的适当构造函数的类都是一个托pipebean。

鉴于EJB和CDI提供了可以更方便地识别托pipebean的方法,您可能会确切地想知道需要使用@ManagedBean 。 Dan提到的答案是,如果您的环境中有CDI(例如,如果您使用的是EE6),那么@ManagedBean并不是真的需要。 @ManagedBean真的有没有使用CDI的人使用JSF2

OTOH,如果你注释一个bean @ManagedBean ,并且在你的环境中有CDI,你仍然可以使用CDI向你的bean注入东西。 只是在这种情况下@ManagedBean注释不是必需的

总而言之, 如果你有CDI可用,它提供了一个优于JSF2从JSF1inheritance的@ManagedBean / @ManagedProperty模型的编程模型 。 事实上,实际上,EE 6 webconfiguration文件并不需要对@ManagedProperty等的支持。这个想法是,您应该只使用CDI。

你有一个select。 可以使用JSF2中的@ManagedBean将Bean绑定到表单中,也可以使用CDI中的@Named注释。 如果你只打算做JSF,你可以坚持@ManagedBean,但是如果你想和EJB集成,或者使用CDI的@ConversationScoped,那么去CDI路由。

就我个人而言,我觉得JSF的下一个版本应该弃用@ManagedBean,并在CDI上进行标准化。 这种双重性让新人感到困惑。

CDI没有观点的范围,因为它没有观点的概念 ,所以如果你需要这个观点的话,纯粹的CDI是无法做到的。 查看范围基本上是指请求范围+为AJAX就绪 。 这不是 JSF视图,就像名为xyz.xhtml的页面,尽pipe您看到JSF <f:viewParam>等等。 视图范围的bean经常使用的情况是如何将GET参数放入一个这样的bean中 。 也读这个 。

请注意,CDI比JSF /表示层更接近于EJB /服务层。 这个博客有一个很好的概述。

正如@ManagedBean不能被CDI完全替代,再次如果你使用@ViewScoped bean – 至less不是没有扩展CDI或使用Seam 3 Faces模块 。 当使用像RichFaces,PrimeFaces,IceFaces等基于AJAX的JSF 2 GUI工具包时,使用视图范围的bean几乎总是会发生的。

从错误的Java EE 6软件包中混合注释可能会在意外地出现问题,而且在使用RichFaces或类似的API时也会遇到麻烦:

 @javax.faces.bean.ManagedBean @javax.faces.bean.[Jsf]Scoped 

在表示层使用的组件,在这里是由RichFaces,PrimeFaces等组成。一些丰富的组件似乎在CDI注释和JSF注释的帮助器bean方面有问题 。 如果你从你的bean(或者看起来什么都不干的豆子)得到奇怪的行为,注释的混合可能是错误的。

混合JSF和CDI一样

 @javax.inject.Named @javax.faces.bean.[Jsf]Scoped 

是可能的,并在大多数情况下从JSF页面引用时工作,但有一些鲜为人知的问题/缺点,例如,当使用CDI没有的JSF范围 :

此外@Named @ViewScoped的组合将不会按预期工作。 特定于JSF的@ViewScoped仅与JSF特定的@ManagedBean结合使用。 您的CDI特定的@Named将像这样使用@RequestScoped 。 使用@ManagedBean而不是@Named或者使用特定@ConversationScoped CDI的@ConversationScoped而不是@ViewScoped

然后

 @javax.inject.Named @javax.faces.bean.[Cdi]Scoped 

可以用于从您的JSF页面AFAIK直接引用的CDI bean。 到目前为止,我还没有遇到任何问题,所以你可以在这里考虑@ManagedBean

剩下的就是服务层,这里大部分事务EJB服务bean被声明为

 @javax.ejb.* 

大多是@ javax.ejb.Stateless。 您甚至可以直接从JSF页面注释和使用EJB,尽pipe我不确定这种devise是否可取。 要引用(注入)用@ javax.ejb。*注释的任何组件,例如@Stateless ,则@Inject@EJB ,如此处所述 。 (可能是这个答案的祖先…)

最后,可以在这里findJava EE 6注释的一个很好的概述: http : //www.physics.usyd.edu.au/~rennie/javaEEReferenceSheet.html

注意 :上面的信息不是来自专家,而是我自己从新手的angular度看待这个令人困惑的Java EE 6注释意大利面 。 更多的见解还有待开发。 我希望这个答案能够成为这个混乱的一个普遍的,实际的答案 – 尽pipe它在原来的问题上已经有点过分了。

正如我刚才在焊接参考 (第12页)中看到的那样,@ManagedBean现在是超级的:

你可以通过注释bean类@ManagedBean显式声明一个托pipebean,但是在CDI中你不需要。 根据规范,CDI容器将任何满足以下条件的类作为托pipebean处理:

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