从上下文中检索另一个bean实例的正确方法

时间:2011-01-20 07:38:15

标签: jsf managed-bean access

我们使用以下代码从上下文中获取托管bean实例。

FacesUtils.getManagedBean("beanName");

这是正确的做法吗?如果多个用户访问同一个bean会发生什么? 如何管理bean实例?

1 个答案:

答案 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。