2013-06-12 42 views
0

我将一个JSF 2.1应用程序迁移到CDI。为了能够使用@javax.faces.bean.ViewScoped注释,我试图使用MyFaces CODI,如建议hereMyFaces CODI实例化bean两次

该应用程序似乎按预期工作,但我注意到通过日志记录,我的每个@Named豆的构造函数在第一次访问时调用两次。但是,注解为@PostConstructinit()方法只能执行一次。

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

只要我从我的应用程序中删除MyFaces CODI罐子,就不会发生这种情况,所以我确信它是由它引起的。

这是一个正常的行为,如果是这样,为什么?它是否对性能有影响或可能导致任何问题?

我觉得这可能与代理创建有关,但它并不是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上测试过,结果相同

谢谢。

回答

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的实现替换它。

+0

感谢您对本文的链接,我会非常感兴趣地阅读它。 – Virginie

+0

接受此答案或更新您的问题的状态。 –

+0

@Virgi不客气。 – rdcrng

0

@rdcrng是正确的。

用CDI你需要@PostConstruct方法。