MyFaces CODI实例化bean两次

时间:2013-06-12 07:21:57

标签: jsf-2 cdi myfaces codi

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

应用程序似乎按预期工作,但我注意到,当我第一次访问它时,我的每个@Named bean的构造函数被调用两次。但是,用init()注释的@PostConstruct方法只执行一次。

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

一旦我从我的应用程序中删除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上测试,结果相同

感谢。

2 个答案:

答案 0 :(得分: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的实现替换它。 / p>

答案 1 :(得分:0)

@rdcrng是正确的。

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