Изучаем Java EE 7 - [125]
Рис. 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-компоненты в контейнере. Исторически сложилось так, что эти контейнеры функционировали в отдельном процессе, из-за чего тестирование было немного утомительным занятием. Вам приходилось запускать свой контейнер (также называемый сервером), упаковывать свои EJB-компоненты, развертывать и тестировать их и в конце концов останавливать сервер… чтобы снова запустить его позднее.
Эта проблема была решена, начиная с EJB 3.1, созданием встраиваемого EJB-контейнера. Версия EJB 3.1 привнесла стандартный API-интерфейс для выполнения EJB-компонентов в среде Java SE. Embeddable API (пакет javax.ejb.embeddable) позволяет клиенту создать экземпляр EJB-контейнера, который будет функционировать в рамках своей виртуальной машины Java. Встраиваемый контейнер обеспечивает управляемую среду с поддержкой тех же базовых служб, которые имеют место в контейнере Java EE: внедрение, управление транзакциями, управление жизненным циклом и т. д. Встраиваемые EJB-контейнеры работают только с API-интерфейсом подмножества EJB Lite (никаких EJB-компонентов, управляемых сообщениями, удаленных вызовов и т. д.), то есть они обладают теми же возможностями, что и контейнер EJB Lite (но не контейнер, отвечающий полной версии EJB).
В листинге 7.22 приведен класс Main, который задействует API-интерфейс для начальной загрузки, чтобы запустить контейнер (абстрактный класс javax.ejb.embeddable.EJBContainer), осуществляет поиск EJB-компонента и вызывает методы в нем.
>public class Main {
>··public static void main(String[] args) throws NamingException {
>····// Задает путь к классам контейнера
>····Map
>····properties.put(EJBContainer.MODULES, new File("target/classes"));
>····// Создает встроенный контейнер и получает JNDI-контекст
>····try (EJBContainer ec = EJBContainer.createEJBContainer(properties)) {
>······Context ctx = ec.getContext();
>······// Создает экземпляр Book
>······Book book = new Book();
>······book.setTitle("Автостопом по Галактике");
>······book.setPrice(12.5F);
>······book.setDescription("Научно-фантастическая комедийная книга");
>······book.setIsbn("1-84173-742-2");
>······book.setNbOfPage(354);
>······book.setIllustrations(false);
>······// Осуществляет поиск EJB-компонента с представлением без интерфейса
>······ItemEJB itemEJB = (ItemEJB) ctx.lookup("java: global/classes/ItemEJB");
>······// Обеспечивает постоянство Book в базе данных
>······itemEJB.createBook(book);
>······// Извлекает информацию обо всех соответствующих книгах из базы данных
>······for (Book aBook: itemEJB.findBooks()) {
>········System.out.println(aBook);
>······}
>····}
>··}
>}
Как вы можете видеть в листинге 7.22, EJBContainer содержит фабричный метод (createEJBContainer()) для создания экземпляра контейнера. По умолчанию встраиваемый контейнер осуществляет поиск, используя путь к классам клиента, чтобы отыскать набор EJB-компонентов для инициализации (либо вы можете задать путь к классам в свойствах). После инициализации контейнера приложение получает JNDI-контекст контейнера (EJBContainer.getContext(), который возвращает javax.naming.Context) для поиска ItemEJB (с использованием синтаксиса переносимых глобальных JNDI-имен).
Следует отметить, что ItemEJB (приведенный ранее в листинге 7.1) является сессионным EJB-компонентом без сохранения состояния, обеспечивающим бизнес-методы с помощью представления без интерфейса. Он использует внедрение, транзакции, управляемые контейнером, и сущность JPA с именем Book. Встраиваемый контейнер заботится о внедрении менеджера сущностей и фиксации или откате любой транзакции. EJBContainer реализует java.lang.AutoCloseable, поэтому блок try-with-resources автоматически вызовет метод EJBContainer.close() для закрытия экземпляра встраиваемого контейнера.
В листинге 7.22 я использовал класс Main, чтобы показать вам, как применять встраиваемый EJB-контейнер. Однако имейте в виду, что в настоящее время EJB-компоненты можно использовать в любой среде Java SE: от тестовых классов до Swing-приложений, и даже при пакетной обработке.
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.