·········http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd"
·········version="3.2">
··
····
······
······
········
········
········
······
······
········
········
········
······
····
··
Теперь, когда параметры приложения располагаются в дескрипторе развертывания, ItemEJB может использовать внедрение зависимостей, чтобы извлечь значение каждой записи окружения. В листинге 7.21 @Resource(name = "currencyEntry") внедряет значение currencyEntry в атрибут currency. Следует отметить, что типы данных записи окружения и внедряемой переменной должны быть совместимыми; в противном случае контейнер сгенерирует исключение.
@Stateless
public class ItemEJB {
··@Resource(name = "currencyEntry")
··private String currency;
··@Resource(name = "changeRateEntry")
··private Float changeRate;
··public Item convertPrice(Item item) {
····item.setPrice(item.getPrice() * changeRate);
····item.setCurrency(currency);
····return item;
··}
}
Как и большинство компонентов Java EE (сервлеты, JSF-страницы, веб-службы и т. д.), EJB-компоненты необходимо упаковать, прежде чем развертывать их в контейнере времени выполнения. В том же самом архиве обычно будет присутствовать класс корпоративного EJB-компонента, его интерфейсы, любые необходимые суперклассы или суперинтерфейсы, исключения, вспомогательные классы и необязательный дескриптор развертывания (ejb-jar.xml). Упаковав эти артефакты в файл с расширением. jar, вы сможете произвести их развертывание непосредственно в контейнере. Еще один вариант заключается в том, что вы также можете встроить файл с расширением. jar в файл с расширением. ear, а затем произвести его развертывание.
Файл с расширением. ear используется для того, чтобы упаковать один или несколько модулей (EJB-файлов с расширением. jar или веб-приложений) в один архив, благодаря чему развертывание на сервере приложений будет происходить одновременно и согласованно. Например, как показано на рис. 7.7, если вам потребуется произвести развертывание веб-приложения, то, возможно, вы захотите упаковать свои EJB-компоненты и сущности в отдельные файлы с расширением. jar, свои сервлеты — в файл с расширением. war, а затем все это — в файл с расширением. ear. Произведите развертывание EAR-файла на сервере приложений, и вы сможете манипулировать сущностями из сервлета с использованием соответствующего EJB-компонента.
Рис. 7.7. Упаковка EJB-компонентов
С выходом EJB 3.1 появилась возможность упаковать EJB Lite непосредственно в веб-модуль (WAR-файл). Справа на рис. 7.7 сервлет, EJB-компонент и сущность упакованы в один и тот же WAR-файл со всеми дескрипторами развертывания. Обратите внимание в EJB-модуле на то, что дескриптор развертывания располагается в файлах META-INF/ejb-jar.xml и WEB-INF/ejb-jar.xml. EJB Lite можно упаковать непосредственно в WAR- или JAR-файл. Если у вас возникнет необходимость использовать полную спецификацию EJB (например, удаленный интерфейс, JMS, асинхронные вызовы…), то придется упаковать все в файл с расширением. jar, а не. war.
Сессионные EJB-компоненты — это компоненты, управляемые контейнерами, в чем и заключается их преимущество. Контейнер сам взаимодействует со всевозможными службами (управление транзакциями, управление жизненным циклом, асинхронность, перехватчики и т. д.), позволяя вам сосредоточиться на бизнес-коде. Недостаток состоит в том, что вам всегда нужно выполнять свои EJB-компоненты в контейнере. Исторически сложилось так, что эти контейнеры функционировали в отдельном процессе, из-за чего тестирование было немного утомительным занятием. Вам приходилось запускать свой контейнер (также называемый сервером), упаковывать свои EJB-компоненты, развертывать и тестировать их и в конце концов останавливать сервер… чтобы снова запустить его позднее.