Различия: @SessionScoped против @Stateful и @ApplicationScoped против @Singleton

Я хотел бы знать, каковы принципиальные различия между:

  1. http://docs.oracle.com/javaee/7/api/javax/enterprise/context/SessionScoped.html и javax.ejb.Stateful
  2. javax.enterprise.context.ApplicationScoped и javax.ejb.Singleton

Я знаю, что @SessionScoped и @Stateful позволяют создать новый экземпляр для каждого клиента. Я также знаю, что для @ApplicationScoped и @Singleton / @Stateless они распределяются между клиентами.

=> Но когда я должен подумать, что лучше выбрать EJB или другой?

1 ответ

@SessionScoped обозначает область, в то время как @Stateful это то, что мы бы сейчас назвали стереотипом. @Stateful добавляет к компоненту число сервисов, среди которых транзакционное поведение и пассивация.

Центральный в @Stateful однако это его поведение сеанса, которое действительно перекрывается с областью сеанса.

Разница в том, что область сеанса связана с сеансом HTTP, а @Stateful является открытым сеансом, управляемым пользователем, время жизни которого управляется клиентом, имеющим ссылку на прокси-компонент бина.

@Stateful удаленные бины, где изначально двоичные (RMI) счетчики частей сервлетов. Где сервлеты слушали удаленные HTTP-запросы из браузера, @Stateful удаленные компоненты прослушивали удаленные RMI-запросы от Applets (и более поздних клиентов Swing).

К сожалению, между ними было много несоответствий. Сервлет был просто слушателем HTTP, а @Stateful бобы автоматически добавили много других функций. Сервлет также разделял сеанс со всеми другими сервлетами, а также разделял пространство имен компонента Java EE со всеми другими сервлетами в войне, в то время как с @Stateful EJB каждый отдельный бин имеет свое собственное пространство имен сессий и компонентов.

С введением в EJB 2 локальных компонентов и резким сокращением числа клиентов Swing/Applet для удаленного обмена данными EJB функция сеанса, которая поддерживается для @Stateful боб стал менее понятным.

Я думаю, что будет справедливо сказать, что @Stateful просто не так уж много используется в эти дни. Для веб-приложения сеанс HTTP почти всегда является ведущим, что означает использование области сеанса и локального @Stateless bean-компоненты и / или CDI-компоненты для бизнес-логики.

В некоторых случаях @Stateful bean-компоненты необходимы для их естественной поддержки расширенного контекста персистентности из JPA и для их функций пассивации (сервлет не имеет стандартизированного механизма пассивации). Обратите внимание, что @Stateful а также @SessionScoped (или многие другие области) могут быть объединены. Преимущество их объединения заключается в том, что пользовательскому коду больше не нужно управлять временем жизни, а контейнер управляет этим.

Есть несколько похожая история для @ApplicationScoped а также @Singletonхотя без наследства (@Singleton это довольно новая вещь). @ApplicationScoped это просто сфера, в то время как @Singleton тип bean-компонента (стереотип, если хотите), который не только дает вам поведение на уровне приложения, но и снова обеспечивает транзакционное поведение с автоматической блокировкой (которую можно настроить с помощью @Lock) и с нетерпеливым поведением при строительстве (через @Startup).

Хотя @Stateful а также @Singleton сами по себе довольно удобны, и в настоящее время Java EE продвигает путь к тому, чтобы разложить эти встроенные стереотипы на отдельно используемые аннотации, и кто знает, возможно, однажды они станут реальными стереотипами CDI, состоящими из этих разложенных аннотаций.

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