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

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

Вызов корпоративных EJB-компонентов

Теперь, когда вы уже видели примеры сессионных EJB-компонентов и их различных интерфейсов, вам, возможно, хочется взглянуть на то, как клиент вызывает эти EJB-компоненты. Клиентом сессионного EJB-компонента может быть любой компонент: POJO, графический интерфейс (Swing), управляемый CDI MBean-компонент, сервлет, EJB-компонент JSF, являющийся подложкой, веб-служба (SOAP или REST) либо другой EJB-компонент (развернутый в том же или другом контейнере).

На стороне клиента также все просто. Чтобы вызвать метод в сессионном EJB-компоненте, клиент не создает экземпляр соответствующего EJB-компонента непосредственным образом (с использованием оператора new). Ему нужна ссылка на этот EJB-компонент (или на его интерфейсы). Он может получить ее при внедрении зависимостей (с использованием аннотации @EJB или @Inject) либо с помощью JNDI-поиска. Внедрение зависимостей позволяет контейнеру автоматически внедрять ссылку на EJB-компонент во время развертывания. Если не предусмотрено иное, то клиент будет вызывать сессионный EJB-компонент синхронно.

Вызов с использованием внедрения

Java EE задействует несколько аннотаций для внедрения ссылок на ресурсы (@Resource), менеджера сущностей (@PersistenceContext), веб-службы (@WebServiceRef) и т. д. Аннотация @javax.ejb.EJB специально предназначена для внедрения ссылок на сессионные EJB-компоненты в клиентский код. Внедрение зависимостей возможно только в управляемых средах вроде EJB-контейнеров, веб-контейнеров и контейнеров клиентских приложений.

Обратимся к нашим исходным примерам, в которых сессионные EJB-компоненты не обладали интерфейсом. Чтобы клиент смог вызвать представление без интерфейса сессионного EJB-компонента, ему необходимо получить ссылку на сам класс EJB-компонента. Например, в приведенном далее коде клиент получает ссылку на класс ItemEJB с использованием аннотации @EJB:

>@Stateless

>public class ItemEJB {…}


>// Клиентский код с внедрением ссылки на EJB-компонент

>@EJB ItemEJB itemEJB;

Если сессионный EJB-компонент реализует несколько интерфейсов, клиенту придется указать, на какой из них ему требуется ссылка. В приведенном далее коде ItemEJB реализует два интерфейса и благодаря аннотации @LocalBean также обеспечивает представление без интерфейса. Клиент может вызвать EJB-компонент с помощью его локального представления, удаленного представления или представления без интерфейса:

>@Stateless

>@Remote(ItemRemote.class)

>@Local(ItemLocal.class)

>@LocalBean

>public class ItemEJB implements ItemLocal, ItemRemote {…}


>// Клиентский код с внедрением нескольких ссылок на EJB-компонент или интерфейсы

>@EJB ItemEJB itemEJB;

>@EJB ItemLocal itemEJBLocal;

>@EJB ItemRemote itemEJBRemote;

У API @EJB имеется несколько атрибутов. Один из них — JNDI-имя EJB-компонента, который вы хотите внедрить. Оно может быть особенно полезно при работе с удаленными EJB-компонентами, располагающимися на другом сервере:

>@EJB(lookup = "java: global/classes/ItemEJB") ItemRemote itemEJBRemote;

Вызов с использованием CDI

Как вы только что видели, для вызова метода в EJB-компоненте требуется только аннотация @EJB, позволяющая внедрить ссылку в клиентский код. Все довольно просто: вы получаете ссылку во время развертывания. Однако @EJB не обеспечивает, например, чего-то подобного CDI-альтернативам. Взамен вам придется использовать аннотацию @Inject.

В большинстве случаев вы можете просто заменять @EJB аннотацией @Inject, и ваш клиентский код будет работать. Сделав это, вы получите все преимущества CDI, которые видели в главе 2. Таким образом, если мы обратимся к приведенным ранее примерам, то вот как обеспечивалось бы EJB-внедрение с использованием CDI в случае с клиентом:

>@Stateless

>@Remote(ItemRemote.class)

>@Local(ItemLocal.class)

>@LocalBean

>public class ItemEJB implements ItemLocal, ItemRemote {…}


>// Клиентский код с внедрением нескольких ссылок на EJB-компонент или интерфейсы посредством @Inject

>@Inject ItemEJB itemEJB;

>@Inject ItemLocal itemEJBLocal;

>@Inject ItemRemote itemEJBRemote;

В случае с удаленными EJB-компонентами, как вы только что видели, вам может потребоваться JNDI-строка для их поиска. Аннотация @Inject не может обладать строковым параметром, так что при этом вам придется создать удаленный EJB-компонент, чтобы вы смогли внедрить его:

>// Код для создания удаленного EJB-компонента

>@Produces @EJB(lookup = "java: global/classes/ItemEJB") ItemRemote 

>··itemEJBRemote;


>// Клиентский код с внедрением созданного удаленного EJB-компонента

>@Inject ItemRemote itemEJBRemote;

В зависимости от клиентской среды у вас может отсутствовать возможность использовать внедрение (если компонент не управляется контейнером). В этом случае попробуйте обратиться к JNDI для поиска сессионных EJB-компонентов с помощью их переносимых JNDI-имен.

Вызов с использованием JNDI

Поиск сессионных EJB-компонентов также можно осуществлять с использованием JNDI, который главным образом применяется для удаленного доступа, когда клиент не управляется контейнером и не может применять внедрение зависимостей. Однако JNDI также может задействоваться локальными клиентами, хотя внедрение зависимостей приводит к тому, что код становится более простым. Внедрение осуществляется во время развертывания. Если есть вероятность того, что данные не будут использоваться, EJB-компонент может избежать затрат, связанных с внедрением ресурсов, выполнив JNDI-поиск. JNDI является альтернативой внедрению. При использовании JNDI код выталкивает данные из стека, только если они необходимы, вместо того чтобы принимать подвергнутые проталкиванию в стек данные, которые могут вообще не потребоваться.


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