В.В. Кулямин - Технологии программирования. Компонентный подход (1133554), страница 68
Текст из файла (страница 68)
предыдущую лекцию).Компонент Enterprise JavaBeans (EJB) является компонентом, представляющим в J2EEприложении элемент данных или внутренней, невидимой для пользователя логики приложения.Для компонентов EJB определен жизненный цикл в рамках рабочего процесса приложения —набор состояний, через которые проходит один экземпляр такого компонента.
Компоненты EJBработают внутри EJB-контейнера, являющегося для них компонентной средой. Функции EJBконтейнера следующие.• Управление набором имеющихся EJB-компонентов, например, поддержкой пулакомпонентов для обеспечения большей производительности, а также жизненным цикломкаждого отдельного компонента, в частности, его инициализацией и уничтожением.• Передача вызовов между EJB-компонентами, а также их удаленных вызовов. НесколькоEJB-контейнеров, работающих на разных машинах, обеспечивают взаимодействие наборовкомпонентов, управляемых каждым из них.• Поддержка параллельной обработки запросов.• Поддержка связи между EJB-компонентами и базой данных приложения и синхронизацияих данных.• Поддержка целостности данных приложения с помощью механизма транзакций.• Защита приложения с помощью механизма ролей: передача прав ролей при вызовах междукомпонентами и проверка допустимости обращения в рамках роли к методам компонентов.Для разработки набора компонентов EJB нужно, во-первых, для каждого компонента создатьодин или несколько классов и интерфейсов Java, обеспечивающих реализацию самойфункциональности компонента и определение интерфейсов для удаленных обращений к нему, и,во-вторых, написать дескриптор развертывания — XML-файл, описывающий следующее.• Набор EJB-компонентов приложения.• Совокупность элементов кода на Java, образующих один компонент.• Связь свойств компонента с полями таблиц БД и связями между таблицами.• Набор ролей, правила доступа различных ролей к методам компонентов, правила передачиролей при вызовах одними компонентами других.• Политику компонентов и их методов по отношению к транзакциям.• Набор ресурсов, которыми компоненты могут пользоваться в своей работе.Правила создания EJB компонента зависят от его вида.
Различают три таких вида EJBкомпонентов.• Компоненты данных (сущностные, entity beans).Представляют данные приложения и основные методы работы с ними.• Сеансовые компоненты (session beans).Представляют независимую от пользовательского интерфейса и конкретных типов данныхлогику работы приложения, называемую иногда бизнес-логикой.245•Компоненты, управляемые сообщениями (message driven beans).Тоже предназначены тоже для реализации бизнес-логики. Но, если сеансовые компонентыпредоставляют интерфейс для синхронных вызовов, компоненты, управляемыесообщениями, предоставляют асинхронный интерфейс. Клиент, вызывающий метод всеансовом компоненте, ждет, пока вызванный компонент не завершит свою работу.Компоненту же, управляемому сообщениями, можно отослать сообщение и продолжатьработу сразу после окончания его передачи, не дожидаясь окончания его обработки.Далее описываются основные правила построения EJB компонентов разных видов.
Болеедетальное описание этих правил можно найти в [1,2].Компоненты данных и сеансовые компонентыКомпонент данных или сеансовый компонент могут состоять из следующих элементов: параинтерфейсов для работы с самим компонентом — удаленный интерфейс и локальный интерфейс;пара интерфейсов для поиска и создания компонентов — удаленный исходный интерфейс илокальный исходный интерфейс; класс компонента, реализующий методы работы с ним; и, длякомпонентов данных, — класс первичного ключа. Обязательно должен быть декларирован класскомпонента и один из интерфейсов — удаленный или локальный.
Для компонентов данныхобязательно должен быть определен класс первичного ключа.• Удаленный интерфейс (remote interface).Этот интерфейс декларирует методы компонента, к которым можно обращаться удаленно,т.е. из компонентов, работающих в рамках другого процесса или на другой машине.Удаленный интерфейс должен наследовать интерфейс javax.ejb.EJBObject (в своюочередь, наследующий java.rmi.Remote).Для компонента данных он определяет набор свойств (в смысле JavaBeans, т.е.
пар методовType getName()/void setName(Type)), служащих для работы с отдельными полямиданных или компонентами, связанными с этим компонентом по ссылкам. Это могут быть ичасто используемые дополнительные операции, как-то выражающиеся через операции сотдельными полями данных, в том числе и вычислимые свойства. Например, для книги вбазе данных приложения хранится набор ссылок на данные об ее авторах, а число авторовможет быть часто используемым свойством книги, вычисляемым по этому набору ссылок.Для сеансового компонента методы удаленного интерфейса служат для реализациинекоторых операций бизнес-логики или предметной области, вовлекающих несколькокомпонентов данных.• Локальный интерфейс (local interface).По назначению этот интерфейс полностью аналогичен удаленному, но декларирует методыкомпонента, которые можно вызывать только в рамках того же процесса. Этот интерфейсслужит для увеличения производительности приложений, в которых взаимодействия междукомпонентами происходят в основном в рамках одного процесса.
При этом они могутиспользовать локальные интерфейсы друг друга, не привлекая сложный механизмреализации удаленных вызовов методов. Однако, при использовании локального интерфейскомпонента нужно обеспечить развертывание этого компонента в рамках того же EJBконтейнера, что и вызывающий его компонент.Локальный интерфейс должен наследовать интерфейсу javax.ejb.EJBLocalObject.• Удаленный исходный интерфейс (remote home interface).Исходные интерфейсы служат для поиска и создания компонентов. Такой интерфейс можетдекларировать метод поиска компонента данных по значению его первичного ключаfindByPrimaryKey(…) и метод создания такого компонента с указанным значениемпервичного ключа create(…). Могут быть также определены методы, создающиекомпонент по набору его данных или возвращающие коллекцию компонентов, данныекоторых соответствуют аргументам такого метода.
Например, метод, создающийкомпонент, который представляет книгу с данным названием, createByTitle(Stringtitle), или метод, находящий все книги с данным набором авторов Collection246••findByAuthors(Collection authors).Удаленный исходный интерфейс предназначен для создания и поиска компонентов извнетого процесса, в котором они работают. Его методы возвращают ссылку на удаленныйинтерфейс компонента или коллекцию таких ссылок.Такой интерфейс должен наследовать интерфейсу javax.ejb.EJBHome (являющемусянаследником java.rmi.Remote).Локальный исходный интерфейс (local home interface).Имеет то же общее назначение, что и удаленный исходный интерфейс, но служит дляработы с компонентами в рамках одного процесса.
Соответственно, его методы поиска илисоздания возвращают ссылку на локальный интерфейс компонента или коллекцию такихссылок.Должен наследовать интерфейсу javax.ejb.EJBLocalHome.Класс компонента (bean class).Этот класс реализует методы удаленного и локального интерфейсов (но не долженреализовывать сами эти интерфейсы!). Он определяет основную функциональностькомпонента.Для компонентов данных такой класс должен быть абстрактным классом, реализующиминтерфейс javax.ejb.EntityBean.
Свойства, соответствующие полям хранимых данныхили ссылкам на другие компоненты данных, должны быть определены в виде абстрактныхпар методов getName()/setName(). В этом случае EJB-контейнер может взять на себяуправление синхронизацией их значений с базой данных. Вычислимые свойства, значениякоторых не хранятся в базе данных, реализуются в виде пар неабстрактных методов.Для сеансовых компонентов класс компонента должен быть неабстрактным классом,реализующим интерфейс javax.ejb.SessionBean и все методы удаленного и локальногоинтерфейсов.Кроме того, класс компонента может (а иногда и должен) реализовывать некоторыеметоды, которые вызываются EJB-контейнером при переходе между различными этапамижизненного цикла компонента.Например, при инициализации экземпляра компонента всегда вызывается методejbCreate().
Для компонентов данных он принимает на вход и возвращает значение типапервичного ключа компонента. Если первичный ключ — составной, он должен приниматьна вход значения отдельных его элементов. Такой метод для компонента данных долженвозвращать null и всегда должен быть реализован в классе компонента. Для сеансовыхкомпонентов он имеет тип результата void, а на вход принимает какие-то параметры,служащие для инициализации экземпляра компонента. Для каждого метода исходныхинтерфейсов с именем createSomeSuffix(…) в классе компонента должен быть реализованметод ejbCreateSomeSuffix(…) с теми же типами параметров.
Для компонентов данныхвсе такие методы возвращают значение типа первичного ключа, для сеансовых — void.Другие методы жизненного цикла компонента, которые можно перегружать в классекомпонента, декларированы в базовых интерфейсах компонентов соответствующего вида(javax.ejb.EntityBean или javax.ejb.SessionBean). Это, например, ejbActivate() иejbPassivate(), вызываемые при активизации и деактивизации экземпляра компонента;ejbRemove(), вызываемый перед удалением экземпляра компонента из памяти; длякомпонентов данных — ejbStore() и ejbLoad(), вызываемые при сохранении данныхэкземпляра в базу приложения или при их загрузке оттуда.Схема жизненного цикла компонента данных показана на Рис.