我们使用以下代码从上下文中获取托管bean实例。
FacesUtils.getManagedBean("beanName");
这是正确的做法吗?如果多个用户访问同一个bean会发生什么? 如何管理bean实例?
答案 0 :(得分:3)
由于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>
faces-config.xml
条目中按照此问题中的说明进行操作:Passing data between managed beans。
如果您碰巧使用CDI @Named
而不是JSF @ManagedBean
,请使用@Inject
代替@ManagedProperty
。为此,不需要setter方法。
关于你的关注
如果多个用户访问同一个bean会发生什么?如何管理bean实例?
它们由JSF管理。如果找到一个bean,那么JSF将只返回这个bean。如果没有找到bean,那么JSF将自动创建一个并放入相关的范围。 JSF不会不必要地创建多个bean。