【问题标题】:Difference between @Named and @ManagedBean annotations in JSF2.0 Tomcat7 [duplicate]JSF2.0 Tomcat7中@Named和@ManagedBean注解的区别[重复]
【发布时间】:2018-05-14 03:09:24
【问题描述】:

这可能是一个菜鸟问题,但是在很多教程和示例中,我看到这些注释的使用就像它们做同样的事情一样。

但是,我在使用 @Named 时遇到了一些限制(尤其是依赖注入等)。我找不到解释差异的来源,如果有人能粗略概述一下,我将非常感激何时使用其中一种。

【问题讨论】:

  • 有哪些限制? @ManagedBean@Named 功能的子集,因此@Named 应该可以在任何地方使用。

标签: jsf-2 dependency-injection el tomcat7


【解决方案1】:

@Named 为 CDI 托管 bean 提供了一个 EL 名称,以便在 JSF 或 JSP 等视图技术中使用。请注意,在 CDI 应用程序中,您不需要需要 @Named 注释来创建由 CDI 管理的 bean(感谢 @Karl 的评论)。

@ManagedBean 使 bean 由 JSF 管理,你可以:

  • 将其注入到其他 @ManagedBean 注释的 bean 中(但不注入到 @Named bean 中!)
  • 通过表达式语言从您的视图中访问它

请参阅此related question 以了解更多信息如何在两种 bean 中进行注入。

请注意,bean 的范围也有所不同。它们来自不同的包,但名称相同(JSF:javax.faces.bean,CDI:javax.enterprise.context,因此如果包含错误的类,通常会导致错误和混乱。

根据我的经验:您应该尽可能使用 CDI bean,因为它们比 JSF 托管 bean 更灵活。 唯一的缺点是 CDI 不知道视图范围,因此您需要退回到 @ManagedBean 或使用诸如 Seam 之类的第三方扩展。

编辑:CDI 支持 ViewScope,更多信息请参见 LINK

【讨论】:

  • +1。 @matt:我认为RequestScoped + KeepAlive = ViewScoped 也可以与@Named 一起使用。我说的对吗?
  • @Abhinav:来自 Richfaces 等组件库的 KeepAlive?
  • 非常感谢您的解释!
  • @matt:在richfaces3.3.3 和JSF2.0 中是的,我正在使用keepalive 和请求范围。
  • 现在您可以通过导入 javax.faces.view.ViewScopedviewScope 用于 CDI beanstackoverflow.com/questions/14384369/…
猜你喜欢
  • 2013-02-28
  • 1970-01-01
  • 2013-10-22
  • 2014-06-12
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多