【问题标题】:MyFaces CODI instantiates beans twiceMyFaces CODI 两次实例化 bean
【发布时间】:2013-06-08 05:30:39
【问题描述】:

我正在将 JSF 2.1 应用程序迁移到 CDI。为了能够使用@javax.faces.bean.ViewScoped 注释,我正在尝试使用MyFaces CODI,正如here 所建议的那样。

该应用程序似乎按预期工作,但我注意到通过记录我的每个 @Named bean 的构造函数在我第一次访问它时被调用了两次。然而,他们用@PostConstruct 注释的init() 方法只执行一次。

当这些 bean 第二次或第 n 次使用时,它们的构造函数只会按正常预期调用一次。

从我的应用程序中删除 MyFaces CODI jar 后不会立即发生,所以我确定它是由它引起的。

这是正常行为吗?如果是,为什么?它对性能有影响还是会导致任何问题?

我觉得这可能与创建代理有关,但我的想法并不是 100% 清楚,因此我非常感谢您的解释。

我的配置:

  • JSF 2.1
  • Mojarra 2.1.6
  • MyFaces CODI 1.0.5(使用完整包或核心 + JSF 2.0+ 测试)
  • (不相关:Primefaces 3.5 和 Omnifaces 1.5)
  • Glassfish 3.1.2,也在 Jboss EAP 6.0 上进行了测试,结果相同

谢谢。

【问题讨论】:

    标签: jsf-2 cdi myfaces codi


    【解决方案1】:

    是的,它与代理创建有关,这是 CDI 的预期行为。请参阅此https://community.jboss.org/blogs/stuartdouglas/2010/10/12/weld-cdi-and-proxies,因为您可能会找到其他解释相同的内容。

    但至于 @javax.faces.bean.ViewScoped 和 CODI 发生这种情况的原因,那是因为 CODI 激活了一个 CDI 扩展,它使用 JSF ViewScope 扫描 bean 并在运行时用它们自己的基于 CDI 的实现替换它。

    【讨论】:

    • 感谢文章的链接,我会怀着极大的兴趣阅读的。
    【解决方案2】:

    @rdcrng 是正确的。

    使用 CDI,您需要 @PostConstruct 方法。

    【讨论】:

      猜你喜欢
      • 2011-08-13
      • 2014-01-29
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      相关资源
      最近更新 更多