渴望ApplicationScoped托管bean构建多次

我有一堆急切的 ApplicationScoped托管bean。 其中一些通过ManagedProperty注释注入到其他注释中,形成依赖树。 每个依赖bean在构造之后操纵其父级。

但是,似乎为每次注射创建了一个新实例,从而使之前的操作无法完成。 据我了解, ApplicationScoped bean只能创建一次。 我误解了或者为什么会这样? 是因为他们渴望吗?

这是一个例子:

ParentBean.java

 package example; import javax.annotation.PostConstruct; import javax.faces.bean.ApplicationScoped; import javax.faces.bean.ManagedBean; @ManagedBean(eager = true) @ApplicationScoped public class ParentBean { static int initCount = 0; // ... @PostConstruct public void init() { ++initCount; // Will end up being between 1 and 3. Expected always 1. // ... } } 

Child1Bean.java

 package example; import javax.annotation.PostConstruct; import javax.faces.bean.ApplicationScoped; import javax.faces.bean.ManagedBean; import javax.faces.bean.ManagedProperty; @ManagedBean(eager = true) @ApplicationScoped public class Child1Bean { @ManagedProperty("#{parentBean}") ParentBean parentBean; public ParentBean getParentBean() { return parentBean; } public void setParentBean(ParentBean parentBean) { this.parentBean = parentBean; } @PostConstruct public void init() { // manipulate parentBean } } 

Child2Bean.java

 package example; import javax.annotation.PostConstruct; import javax.faces.bean.ApplicationScoped; import javax.faces.bean.ManagedBean; import javax.faces.bean.ManagedProperty; @ManagedBean(eager = true) @ApplicationScoped public class Child2Bean { @ManagedProperty("#{parentBean}") ParentBean parentBean; public ParentBean getParentBean() { return parentBean; } public void setParentBean(ParentBean parentBean) { this.parentBean = parentBean; } @PostConstruct public void init() { // manipulate parentBean } } 

我希望在Tomcat 8 + Mojarra 2.2.0上解决这个问题。 在我的例子中,我刚刚从web.xml中删除了监听器声明

  com.sun.faces.config.ConfigureListener  

之后似乎会调用构造函数。

关于听众录入, 这个问题有BalusC回答的一部分。

在任何情况下,在web.xml中显式注册Mojarra的ConfigureListener实际上只需要解决在Mojarra的TLD文件中找不到监听器的旧错误服务器,例如GlassFish v3和Jetty。 当部署到体面的服务器时,整个条目是不必要的。

我对Mojarra 2.0.x也有同样的问题。 我想这个问题与multithreadingJSF启动有关。 尝试通过com.sun.faces.enableMultiThreadedStartup参数禁用它。