Различия: @SessionScoped против @Stateful и @ApplicationScoped против @Singleton
Я хотел бы знать, каковы принципиальные различия между:
- http://docs.oracle.com/javaee/7/api/javax/enterprise/context/SessionScoped.html и javax.ejb.Stateful
- 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, состоящими из этих разложенных аннотаций.