【发布时间】:2012-10-12 00:26:32
【问题描述】:
我有一堆 渴望 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
}
}
【问题讨论】:
-
你能举个代码例子说明你是怎么做的吗?
-
别以为我会做任何改变,但试试
@ManagedProperty(value = "#{parentBean}"), -
表达式是等价的,但我试过了。没有变化。
-
我没有任何注射,并且在 Tomcat7.0.53 / Mojarra 2.2.6 上遇到了同样的问题。我的应用程序范围渴望 bean 构造了 3 次。非急切的只构建一次。
标签: java jsf jakarta-ee jsf-2 managed-bean