Обычно я использую @RequestScoped
или @SessionScoped
(от javax.enterprise.context
) для ввода объектов (например, в лицах beans) с помощью @Inject
.
Я также использую EJB. Как я понял, для экземпляров объектов используется набор копий EJB без сохранения состояния (пул). Причина, по которой существует много копий, заключается в обеспечении одновременного доступа к одному экземпляру EJB. Когда речь идет о EJB состояния (как я понял), один из таких примеров связан с конкретной точкой инъекции. И они вводятся с помощью @EJB
(также без апатии).
Часто я вижу на веб-примерах использование @Stateless
или @Stateful
в сочетании с @Scoped
. В чем их смысл?
Изменить: (попытка уточнить, поскольку никто не ответил на этот момент):
Мне особенно интересно, изменяются ли такие аннотации с аннотациями в любом случае (и если они - как) момент создания экземпляра EJB.
Для моего понимания: если у меня есть, @EJB
аннотированное поле, туда вводится объект соответствующего класса. Если такой EJB не имеет статуса, контейнер просто извлекает бесплатный экземпляр из пула предварительно созданных экземпляров. При необходимости пул может быть изменен. Он не имеет статуса, поскольку объект не может быть сохранен во всех вызовах метода нашего класса (т.е. класс, который имеет поле, содержащее ссылку на EJB).
Мы также можем использовать stateful EJB, и в этом случае во время вызовов метода сохраняется один экземпляр. Как я думаю, он будет просто вводиться один раз для создания объекта. (Существует также одноэлементный EJB, который разделяется между всеми объектами).
Я не могу найти цель @Scoped аннотаций для EJB здесь.
Изменить 2:
Можно использовать такую комбинацию аннотаций, если класс вводится через EJB и DI (через @Inject
) механизмы. Это скорее, однако, особый случай, а не элегантный. Я спрашиваю, знаете ли вы какие-либо другие причины.
Изменить 3: Пожалуйста, см. Мой комментарий в ответ arjan.