由于CDI(及其实施焊接),JEE6中的每个pojo都可以注释 @Named, ,这使Pojo可以访问视图。

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

有帮助吗?

解决方案

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

回复:与JSF2中的@managedBean注释进行比较?:

在查看焊接示例和较旧的韦伯人文档时,看起来像是新的@managedBean JSF 2.0注释的竞争对手。是否有任何信息何时要使用另一个信息?

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

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

这个想法是,其他规格(以EJB,CDI,JSF和新的Java Interceptors规格开头)建立在此基础组件模型上,并层面其他服务,例如交易管理,类型AFT依赖性注入,拦截器。因此,在这个级别上,托管的豆类,CDI,拦截器和EJB规格都与之携带,并且具有高度互补的作用。

现在,关于确切确定哪些类是托管豆类的托管豆类规范。它确实提供了 @ManagedBean 注释是一种机制,但也允许其他规范定义不同的机制。因此,例如:

  • EJB规范说,一类使用某些编程限制的课程 @Stateless 或者 @Stateful EJB JAR中部署的注释是托管bean。

  • CDI规范说,在“ Bean Deployment Archive”中部署的任何适当构造函数的类都是托管Bean。

鉴于EJB和CDI可以说明识别托管豆的更方便的方法,您可能会想知道什么 @ManagedBean 需要。正如Dan所指的那样,答案是,如果您在环境中有可用的CDI(例如,如果您使用的是EE6),则 @ManagedBean 只是真的不需要。 @ManagedBean 实际上是在没有CDI的JSF2的人使用的地方使用.

OTOH,如果您确实注释了豆 @ManagedBean, ,并且您确实在环境中有CDI,您仍然可以使用CDI将东西注入豆子。只是 @ManagedBean注释不是 必需的 在这种情况下。

总结, 如果您确实可以使用CDI,它提供了一个 远的卓越的编程模型 @ManagedBean/@ManagedProperty JSF2从JSF1继承的模型. 。实际上,如此优越,以至于EE 6 Web个人资料不需要支持 @ManagedProperty 等等。想法是您应该只是使用CDI。

其他提示

你有选择。要么使用JSF2的@ManagedBean将豆子绑定到您的表格中,要么使用CDI的@Named注释。如果您只打算执行JSF,则可以坚持@managedBean,但是如果您想与EJB集成,或者使用CDI的@conversationscoped,请使用CDI路由。

我个人认为下一个JSF的下一个版本应该贬低@managedBean,并以CDI为标准化。二元性使新来者感到困惑。

CDI没有视图范围,因为它 没有视图的概念, ,因此,如果您需要该范围,则其纯净形式的CDI将无法做到。查看范围基本上意味着 请求范围 +准备AJAX. 。它是 不是 JSF视图,就像一个名称的页面 xyz.xhtml, ,即使您看到JSF <f:viewParam> 和喜欢的。经常带有视图豆的用例是 如何将参数获取到这样的豆子. 。还 读这个.

请注意,CDI宁愿生活在EJB/服务层,而不是JSF/演示层。 这个博客 有一个不错的概述。

像这样 @ManagedBean 如果您正在使用 @ViewScoped 豆 - 至少不是没有 扩展CDI 或使用 接缝3脸模块. 。当使用Ajax的JSF 2基于Richfaces,PrimeFaces,Icefaces等时,使用视图划分的豆几乎总是会发生。

从错误的Java EE 6包中混合注释 能够 使用RichFaces或类似API时,会出乎意料地遇到麻烦:

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

用于使用的组件 独自 在演示层,在这里,由Richfaces,PrimeFaces等。一些丰富的组件 似乎有CDI-NONTOTED和JSF注销的辅助豆豆有问题. 。如果您从豆(或似乎什么都不做的豆类)中获得奇怪的行为,那么注释的错误组合可能就是原因。

混合JSF和CDI

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

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

也是组合 @Named @ViewScoped 无法按预期工作。 JSF特定的 @ViewScoped 与JSF特异性的结合作品 @ManagedBean 只要。您的CDI特定 @Named 会表现得像 @RequestScoped 这边走。两种用法 @ManagedBean 代替 @Named 或使用CDI特异性 @ConversationScoped 代替 @ViewScoped.

然后

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

可用于直接从JSF页面AFAIK引用的CDI豆。到目前为止,我对上述组合还没有任何问题,因此您可以考虑 @ManagedBean 在这里过时。

剩下的是服务层,这里主要是交易ejb服务bean被宣布为

@javax.ejb.*

主要是 @javax.ejb.stateless。您甚至可以注释和使用 EJB直接来自JSF页面 - 尽管我不确定这种设计是否理想。引用(注入) @javax.ejb。*,例如*,例如 @Stateless, , 更喜欢 @Inject 超过 @EJB 如下所述. 。 (可能是这个答案的祖先...)

最后,可以在这里找到一个非常好的Java EE 6注释的概述:http://www.physics.usyd.edu.au/~rennie/javaeereferencesheet.html

笔记: :以上信息不是来自专家,而是从新移民的角度来看我自己的看法 令人困惑的Java EE 6注释意大利面条. 。更多的见识尚未开发。我希望这个答案能够忍受成为这种混乱的一般性,实用的答案 - 即使它在原始问题的背景下已经有些过分了。

当我刚刚读到 焊接参考 (p。12),@managedBean现在是过多的:

您可以通过注释bean class @managedBean来明确声明托管的bean,但是在CDI中,您不需要。根据规范,CDI容器将满足以下条件作为托管bean的任何类别视为:

  • 它不是非静态内部类。它是一个具体的类,或者是注释@decorator。
  • 它没有用EJB组件定义注释来注释,也没有在ejb-jar.xml中声明为EJB bean类。
  • 它不会实现javax.enterprise.inject.spi.extension。
  • 它具有适当的构造函数 -
  • 该类有一个没有参数的构造函数,或
  • 该类声明一个构造函数注释@Inject。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top