1

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

FacesUtils.getManagedBean("beanName");

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

4

1 回答 1

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>输入来完成:在托管 bean 之间传递数据faces-config.xml

如果您碰巧使用 CDI@Named代替 JSF @ManagedBean,请使用@Inject代替@ManagedProperty. 为此,不需要 setter 方法。

也可以看看:


至于你的关心

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

它们由 JSF 管理。如果找到了一个 bean,那么 JSF 将只返回这个 bean。如果没有找到 bean,那么 JSF 将自动创建一个并放入关联的范围内。JSF 不会不必要地创建多个 bean。

于 2011-01-20T12:51:12.920 回答