Правильный способ получения другого экземпляра компонента из контекста - PullRequest
1 голос
/ 20 января 2011

Мы используем следующий код для получения экземпляра управляемого компонента из контекста.

FacesUtils.getManagedBean("beanName");

Это правильный способ сделать это? Если несколько пользователей получат доступ к одному и тому же компоненту, что произойдет? Как управляются экземпляры bean-компонентов?

1 Ответ

3 голосов
/ 20 января 2011

Поскольку FacesUtils не является частью стандартной реализации JSF, неясно, что он на самом деле делает под прикрытием.

Независимо от того, когда вы уже внутри управляемого компонента,тогда предпочтительным способом является внедрение другого компонента в качестве управляемого свойства.Я предполагаю, что вы уже используете 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, как объясняется в этом вопросе: Передача данных между управляемыми bean-компонентами .

Если вам случится использовать CDI @Named вместо JSF @ManagedBean, используйте @Inject вместо @ManagedProperty.Для этого метод установки не требуется.

См. Также:


Ваша проблема

Если несколько пользователей получат доступ к одному и тому же компоненту, что произойдет?Как управляются экземпляры bean-компонентов?

Они управляются JSF.Если бин найден, JSF просто вернет именно этот бин.Если бин не найден, JSF просто создаст его и поместит в соответствующую область.JSF не будет создавать ненужные бины.

...