【问题标题】:Correct way of retrieving another bean instance from context [duplicate]从上下文中检索另一个 bean 实例的正确方法 [重复]
【发布时间】:2011-06-12 06:53:48
【问题描述】:

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

FacesUtils.getManagedBean("beanName");

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

【问题讨论】:

  • 你不指定哪个库或 API 属于你的 FAcesUtils 类,所以很难知道这个方法在做什么。此外,这个问题的公认答案可能会有所帮助:stackoverflow.com/questions/2633112/…
  • 那个链接的问题最初是关于当你 notFacesContext 中时检索 bean,例如在一个普通的 servlet 或一些随机的 Javabean 中。

标签: jsf managed-bean


【解决方案1】:

由于 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 时,您需要通过 faces-config.xml 中的 <managed-property> 条目来执行此操作,如以下问题所述:Passing data between managed beans

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

另见:


至于你的担心

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

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

【讨论】:

    猜你喜欢
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多