0

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

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

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

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

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

我觉得这可能与代理创建有关,但在我看来并不是 100% 清楚,所以我非常感谢您的解释。

我的配置:

  • JSF 2.1
  • 莫哈拉 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 上进行了测试,结果相同

谢谢。

4

2 回答 2

3

是的,它与代理创建有关,这是 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 的实现替换它。

于 2013-06-12T10:39:29.897 回答
0

@rdcrng 是正确的。

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

于 2013-06-12T22:12:52.813 回答