我正在将JSF 2.1应用程序迁移到CDI。为了能够使用@javax.faces.bean.ViewScoped
注释,我正在尝试使用MyFaces CODI,如建议here。
应用程序似乎按预期工作,但我注意到,当我第一次访问它时,我的每个@Named
bean的构造函数被调用两次。但是,用init()
注释的@PostConstruct
方法只执行一次。
当第二次或第n次使用这些bean时,它们的构造函数只会按正常情况调用一次。
一旦我从我的应用程序中删除MyFaces CODI jar,就不会发生这种情况,所以我确定它是由它引起的。
这是正常行为,如果是,为什么?它会对性能产生影响还是会导致任何问题?
我觉得这可能与代理创建有关,但在我的脑海中并没有100%清楚,所以我非常感谢你的解释。
我的配置:
感谢。
答案 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方法。