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

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

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

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

В порядке ли это реализовать в производственной среде?

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

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

Автогенерированный class прокси для @Stateless EJB выглядит примерно так (на самом деле это сложнее, например, транзакция DB также должна быть получена, запущена и зафиксирована здесь):

 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; } // ... } 

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

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

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


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

Абсолютно. В противном случае их не было.

  • Как загрузить файл с помощью JSF 2.2 ? Где сохраненный файл?
  • Давайте будем гением компьютера.