При использовании @EJB каждый управляемый компонент получает свой собственный экземпляр @EJB?

Я использую JSF 2.2 для веб-проекта и сейчас реализую страницу входа.

у меня есть login.xhtml который служит в качестве представления, и боб называется UserLoginView,
Этот боб имеет EJB свойство bean private UserService userService (как показано здесь).

Значит ли это, что каждый новый UserLoginView получает новый экземпляр UserService?

Можно ли это реализовать в производственной среде?

1 ответ

Решение

Означает ли это, что каждый новый UserLoginView получает новый экземпляр UserService?

Нету. Данный UserService это @Stateless EJB. @Stateless EJB объединяются и вводятся как сериализуемые прокси, автоматически генерируемые контейнером. Среди прочего, доказательством этого является трассировка стека, когда происходит исключение из EJB. Вы видите дополнительные слои между методом базового компонента и методом EJB.

Автогенерируемый прокси-класс для @Stateless EJB выглядит примерно так (на самом деле он более сложный, например, здесь необходимо получить, запустить и зафиксировать транзакцию БД):

public class UserServiceProxy extends UserService implements Serializable {

    public User find(Long id) {
        UserService instance = getAnAvailableInstanceFromPool();
        User result = instance.find(id);
        releaseInstanceToPool(instance);
        return result;
    }

    public Long save(User user) {
        UserService instance = getAnAvailableInstanceFromPool();
        Long result = instance.save(user);
        releaseInstanceToPool(instance);
        return result;
    }

    // ...
}

Вы видите это? Он просто получает доступный экземпляр из пула EJB, а затем делегирует ему вызов метода и, наконец, передает его в пул для повторного использования в будущем. Это именно тот экземпляр прокси, который фактически внедряется в ваш управляемый компонент JSF.

Кстати, CDI работает так же. Именно поэтому с помощью CDI возможно внедрить bean-компонент более узкой области в bean-компонент более широкой области действия и при этом заставить его работать так, как задумано. JSF, @ManagedBean внедряет фактический экземпляр, и поэтому он не работает таким образом. Это сработало бы, если бы JSF также использовал прокси, которые фактически захватывали текущий экземпляр компонента через FacesContext и делегированы ему.

Только @Stateful EJB на самом деле привязаны к жизни клиента. В случае управляемого компонента в качестве клиента он действительно получит "свой" экземпляр. См. Также JSF bean-объект bean-объекта продолжает повторять новые сеансовые bean-объекты Stateful при каждом запросе?


Можно ли это реализовать в производственной среде?

Абсолютно. Иначе их не было.

Другие вопросы по тегам