我们使用以下代码从上下文中获取托管 bean 实例。
FacesUtils.getManagedBean("beanName");
这是正确的做法吗?如果多个用户访问同一个 bean 会发生什么?bean 实例是如何管理的?
我们使用以下代码从上下文中获取托管 bean 实例。
FacesUtils.getManagedBean("beanName");
这是正确的做法吗?如果多个用户访问同一个 bean 会发生什么?bean 实例是如何管理的?
由于FacesUtils
不是标准 JSF 实现的一部分,因此不清楚它实际上在做什么。
无论如何,当您已经在托管 bean 中时,首选方法是将另一个 bean 作为托管属性注入。我假设您已经在使用 JSF 2.0,所以这里有一个针对 JSF 2.0 的示例。
@ManagedBean
@SessionScoped
public void OtherBean {}
@ManagedBean
@RequestScoped
public void YourBean {
@ManagedProperty("#{otherBean}")
private void OtherBean;
@PostConstruct
public void init() {
otherBean.doSomething(); // OtherBean is now available in any method.
}
public void setOtherBean(OtherBean otherBean) {
this.otherBean = otherBean;
}
// Getter is not necessary.
}
但是,当您仍在使用 JSF 1.x 时,您需要按照以下问题中的说明通过<managed-property>
输入来完成:在托管 bean 之间传递数据。faces-config.xml
如果您碰巧使用 CDI@Named
代替 JSF @ManagedBean
,请使用@Inject
代替@ManagedProperty
. 为此,不需要 setter 方法。
至于你的关心
如果多个用户访问同一个 bean 会发生什么?bean 实例是如何管理的?
它们由 JSF 管理。如果找到了一个 bean,那么 JSF 将只返回这个 bean。如果没有找到 bean,那么 JSF 将自动创建一个并放入关联的范围内。JSF 不会不必要地创建多个 bean。