@Local(ItemLocal.class)
@LocalBean
public class ItemEJB implements ItemLocal, ItemRemote {
··//…
}
После развертывания контейнер сгенерирует три JNDI-имени, чтобы внешний компонент смог получить доступ к ItemEJB, используя следующие глобальные JNDI-имена:
java: global/cdbookstore/ItemEJB!org.agoncal.book.javaee7.ItemRemote
java: global/cdbookstore/ItemEJB!org.agoncal.book.javaee7.ItemLocal
java: global/cdbookstore/ItemEJB!org.agoncal.book.javaee7.ItemEJB
Следует отметить, что если бы ItemEJB был развернут в файле с расширением EAR (например, myapplication.ear), то вам пришлось бы указать в <имя приложения> следующее:
java: global/myapplication/cdbookstore/ItemEJB!org.agoncal.book.javaee7.ItemRemote
java: global/myapplication/cdbookstore/ItemEJB!org.agoncal.book.javaee7.ItemLocal
java: global/myapplication/cdbookstore/ItemEJB!org.agoncal.book.javaee7.ItemEJB
Контейнер также требуется для того, чтобы сделать JNDI-имена доступными при использовании пространств имен java: app и java: module. Таким образом, компонент, развернутый в том же приложении, что и ItemEJB, сможет осуществлять его поиск с использованием следующих JNDI-имен:
java: app/cdbookstore/ItemEJB!org.agoncal.book.javaee7.ItemRemote
java: app/cdbookstore/ItemEJB!org.agoncal.book.javaee7.ItemLocal
java: app/cdbookstore/ItemEJB!org.agoncal.book.javaee7.ItemEJB
java: module/ItemEJB!org.agoncal.book.javaee7.ItemRemote
java: module/ItemEJB!org.agoncal.book.javaee7.ItemLocal
java: module/ItemEJB!org.agoncal.book.javaee7.ItemEJB
Такое переносимое JNDI-имя применимо ко всем сессионным EJB-компонентам: без сохранения состояния, с сохранением состояния и одиночным.
EJB-компоненты без сохранения состояния
EJB-компоненты без сохранения состояния — это самые популярные среди разработчиков приложений Java EE сессионные EJB-компоненты. Они простые, мощные, эффективные. Кроме того, они позволяют решать общую задачу, которая заключается в обработке бизнес-данных без сохранения состояния. Что означает словосочетание «без сохранения состояния»? Оно означает, что задача должна быть выполнена одним вызовом метода.
В качестве примера мы можем вернуться к корням объектно-ориентированного программирования, где объект инкапсулирует свое состояние и поведение. Чтобы обеспечить постоянство Book в базе данных при объектном моделировании, вы поступили бы примерно так: создали экземпляр объекта Book (с использованием ключевого слова new), задали кое-какие значения и вызвали метод, чтобы этот объект смог обеспечить свое постоянство в базе данных (book.persistToDatabase()). В приведенном далее коде вы можете видеть, что с самой первой и до последней строки объект Book вызывается несколько раз и поддерживает свое состояние:
Book book = new Book();
book.setTitle("Автостопом по Галактике");
book.setPrice(12.5F);
book.setDescription("Научно-фантастический комедийный сериал, созданный Дугласом Адамсом");
book.setIsbn("1-84023-742-2");
book.setNbOfPage(354);
book.persistToDatabase();
В архитектуре служб вы делегировали бы бизнес-логику внешней службе. Службы без сохранения состояния идеально подходят, когда вам необходимо выполнить задачу, с которой можно справиться одним вызовом метода (передав при этом все необходимые параметры). Службы без сохранения состояния независимы, обособленны и не требуют информации или состояния от одного запроса к другому. Таким образом, если вы возьмете предыдущий код и добавите службу без сохранения состояния, то вам потребуется создать объект Book, задать кое-какие значения, а затем воспользоваться службой без сохранения состояния для вызова метода, который обеспечит постоянство Book от его имени одним вызовом. Состояние будет поддерживать Book, а не служба без сохранения состояния:
Book book = new Book();
book.setTitle("Автостопом по Галактике");