我正在将JSF2.1应用程序迁移到CDI。为了能够使用@javax.faces.bean.ViewScoped注释,我尝试使用MyFaces CODI,正如建议的here。
应用程序似乎按预期工作,但我通过日志记录注意到,当我第一次访问@Named bean时,每个bean的构造函数都会被调用两次。但是,它们使用@PostConstruct注释的@PostConstruct方法只执行一次。
当第二次或第九次使用这些bean时,它们的构造函数只能按照通常的预期调用一次。
当我从我的应用程序中删除MyFaces CODI jars时,它就不会发生,所以我确信它是由它引起的。
这是正常的行为吗?如果是的话,为什么?它对性能有影响吗?这会不会造成任何问题?
我觉得这可以与代理创建联系起来,但在我的脑海中并不是100%清晰,所以我非常希望得到一个解释。
我的配置:
谢谢。
发布于 2013-06-12 10:39:29
是的,它与代理创建有关,它是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-12 22:12:52
@rdcrng是正确的。
使用CDI时,您需要@PostConstruct方法。
https://stackoverflow.com/questions/17059810
复制相似问题