Изучаем Java EE 7 - [116]

Шрифт
Интервал

>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("Автостопом по Галактике");

>book.setPrice(12.5F);

>book.setDescription("Научно-фантастический комедийный сериал, созданный Дугласом Адамсом.");

>book.setIsbn("1-84023-742-2");

>book.setNbOfPage(354);

>statelessService.persistToDatabase(book);

Сессионные EJB-компоненты без сохранения состояния придерживаются архитектуры служб и являются самой эффективной компонентной моделью, поскольку могут быть помещены в пул и совместно использоваться несколькими клиентами. Это означает, что для каждого EJB-компонента без сохранения состояния контейнер оставляет определенное количество экземпляров в памяти (то есть в пуле) и позволяет клиентам совместно использовать их. Поскольку EJB-компоненты без сохранения состояния не обладают клиентским состоянием, все экземпляры являются одинаковыми. Когда клиент вызывает метод в EJB-компоненте без сохранения состояния, контейнер берет экземпляр из пула и присваивает его клиенту. По завершении выполнения клиентского запроса экземпляр возвращается в пул для повторного использования. Это означает, что вам потребуется лишь небольшое количество EJB-компонентов для обслуживания нескольких клиентов, как показано на рис. 7.4. Контейнер не гарантирует одного и того же экземпляра для одного и того же клиента.


Рис. 7.4. Клиенты, осуществляющие доступ к EJB-компонентам без сохранения состояния в пуле


В листинге 7.6 показано, как выглядит EJB-компонент без сохранения состояния: стандартный Java-класс со всего одной аннотацией @Stateless. Поскольку он располагается в контейнере, у него есть возможность использовать любые службы, управляемые контейнером, одна из которых позволяет внедрять зависимости. Мы применяем аннотацию @PersistenceContext для внедрения ссылки на менеджер сущностей. В случае с сессионными EJB-компонентами без сохранения состояния контекст постоянства является транзакционным, а это означает, что любой метод, вызываемый в этом EJB-компоненте (createBook(), createCD() и т. д.), будет транзакционным. Этот процесс более подробно объясняется в главе 9. Следует отметить, что у всех методов есть необходимые параметры для обработки бизнес-логики одним вызовом. Например, метод createBook() принимает объект Book в качестве параметра и обеспечивает его постоянство без расчета на другое состояние.


Листинг 7.6. Сессионный EJB-компонент без сохранения состояния ItemEJB

>@Stateless

>public class ItemEJB {

>··@PersistenceContext(unitName = "chapter07PU")

>··private EntityManager em;

>··public List findBooks() {

>····TypedQuery query = em.createNamedQuery(Book.FIND_ALL, Book.class);

>····return query.getResultList();

>··}

>··public List findCDs() {

>····TypedQuery query = em.createNamedQuery(CD.FIND_ALL, CD.class);

>····return query.getResultList();

>··}

>··public Book createBook(Book book) {

>····em.persist(book);

>····return book;

>··}

>··public CD createCD(CD cd) {

>····em.persist(cd);

>····return cd;

>··}

>}

EJB-компоненты без сохранения состояния зачастую содержат несколько тесно связанных бизнес-методов. Например, ItemEJB из листинга 7.5 определяет методы, связанные с элементами, продажа которых осуществляется в приложении CD-BookStore. Таким образом, вы найдете методы для создания, обновления или поиска экземпляров Book и CD, а также другой связанной бизнес-логики.

Аннотация @Stateless помечает Java-объект ItemEJB как EJB-компонент без сохранения состояния, тем самым превращая простой Java-класс в компонент, поддерживающий контейнер. В листинге 7.7 описывается спецификация аннотации @javax.ejb.Stateless.


Листинг 7.7. API-интерфейс аннотации @Stateless

>@Target({TYPE}) @Retention(RUNTIME)

>public @interface Stateless {

>····String name() default "";

>····String mappedName() default "";

>····String description() default "";

>}

Параметр name определяет имя EJB-компонента и по умолчанию имеет значение в виде имени класса (ItemEJB в листинге 7.6). Этот параметр можно задействовать, например, для поиска EJB-компонента с применением JNDI. Параметр description — это строка, которая может быть использована для описания EJB-компонента. Атрибут mappedName определяет глобальное JNDI-имя, присваиваемое контейнером. Следует отметить, что это JNDI-имя зависит от поставщика и, следовательно, не является переносимым. mappedName не имеет связи с переносимым


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.