При использовании @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 при каждом запросе?
Можно ли это реализовать в производственной среде?
Абсолютно. Иначе их не было.