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

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

На момент написания этой книги GlassFish представлял собой реализацию, совместимую только с EJB 3.2. Но скоро очередь дойдет и до остальных: OpenEJB, JBoss, Weblogic, Websphere…

Написание корпоративных EJB-компонентов

Сессионные EJB-компоненты инкапсулируют бизнес-логику и опираются на контейнер, который отвечает за организацию пула, многопоточность, безопасность и т. д. Какие артефакты нам нужны для того, чтобы создать такой мощный компонент? Один Java-класс и одна аннотация — вот и все. В листинге 7.1 показано, насколько просто контейнеру распознать, что класс является сессионным EJB-компонентом, и применить все корпоративные службы.


Листинг 7.1. Простой EJB-компонент без сохранения состояния

>@Stateless

>public class BookEJB {

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

>··private EntityManager em;

>··public Book findBookById(Long id) {

>····return em.find(Book.class, id);

>··}

>··public Book createBook(Book book) {

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

>····return book;

>··}

>}

Предыдущие версии J2EE вынуждали разработчиков создавать ряд артефактов для того, чтобы сгенерировать тот или иной сессионный EJB-компонент: локальный либо удаленный интерфейс (или и тот и другой), локальный домашний либо удаленный домашний интерфейс (или и тот и другой) и дескриптор развертывания. Java EE 5 и EJB 3.0 существенно упростили модель до такой степени, что стало достаточно лишь одного класса и одного или нескольких бизнес-интерфейсов, и вам не потребуется какая-либо XML-конфигурация. Как показано в листинге 7.1, с выходом EJB 3.1 классу даже не нужно реализовывать какой-либо интерфейс. Мы используем только одну аннотацию для того, чтобы превратить Java-класс в транзакционный и безопасный компонент — @Stateless. Затем, применяя менеджер сущностей (как можно было видеть в предыдущих главах), BookEJB создает и извлекает экземпляры Book из базы данных простым, но все же эффективным способом.

Анатомия EJB-компонента

В листинге 7.1 показана самая простая модель программирования для сессионных EJB-компонентов — аннотированный Java-объект без интерфейса. Однако, в зависимости от ваших нужд, сессионные EJB-компоненты могут обеспечить намного более богатую модель, позволив вам выполнять удаленные вызовы, внедрение зависимостей или асинхронные вызовы. EJB-компонент состоит из таких элементов, как:

• класс EJB-компонента, который содержит реализацию бизнес-методов и может реализовывать нуль или несколько бизнес-интерфейсов. Сессионный EJB-компонент должен быть снабжен аннотацией @Stateless, @Stateful или @Singleton в зависимости от своего типа;

• бизнес-интерфейсы, которые содержат объявление бизнес-методов, видимых для клиента и реализуемых классом EJB-компонента. Сессионный EJB-компонент может обладать локальными интерфейсами, удаленными интерфейсами либо не иметь вообще никакого интерфейса (представление без интерфейса только с локальным доступом).

Как показано на рис. 7.2, клиентское приложение может получить доступ к сессионному EJB-компоненту посредством одного из его интерфейсов (локального или удаленного) либо напрямую, вызвав сам класс EJB-компонента.


Рис. 7.2. Класс EJB-компонента обладает бизнес-интерфейсами нескольких типов

Класс EJB-компонента

Класс сессионного EJB-компонента — это любой Java-класс, который реализует бизнес-логику. Требования для разработки класса сессионного EJB-компонента таковы:

• класс должен быть снабжен аннотацией @Stateless, @Stateful, @Singleton или XML-эквивалентом в дескрипторе развертывания;

• он должен реализовывать методы своих интерфейсов при наличии таковых;

• класс должен быть определен как public и не должен быть final или abstract;

• класс должен располагать конструктором public без аргументов, который контейнер будет использовать для создания экземпляров;

• класс не должен определять метод finalize();

• имена бизнес-методов не должны начинаться с ejb, при этом они не могут быть final или static;

• аргумент и возвращаемое значение удаленного метода должны относиться к допустимым типам RMI.

Удаленные и локальные представления, а также представление без интерфейса

В зависимости от того, откуда клиент станет вызывать сессионный EJB-компонент, классу EJB-компонента потребуется реализовывать удаленный или локальный интерфейсы либо не реализовывать вообще никакого интерфейса. Если ваша архитектура включает клиентов, которые находятся вне экземпляра виртуальной машины Java EJB-контейнера, то они должны использовать удаленный интерфейс. Как показано на рис. 7.3, это касается клиентов, работающих на отдельной виртуальной машине Java, в контейнере клиентского приложения (Application Client Container — ACC), или во внешнем веб-контейнере, или в EJB-контейнере. В этом случае клиентам придется вызывать методы сессионных EJB-компонентов с использованием удаленного вызова методов. Вы можете прибегнуть к локальному вызову, если EJB-компонент и клиент будут функционировать на одной и той же виртуальной машине Java. Это может быть вызов одним EJB-компонентом другого EJB-компонента или веб-компонента (сервлета, JSF), работающего в веб-контейнере на той же самой виртуальной машине Java. Кроме того, ваше приложение может использовать как удаленные, так и локальные вызовы в случае с одним и тем же сессионным EJB-компонентом.


Рекомендуем почитать
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 так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.