С тех пор как компания Sun в 1997 году представила технологию EJB широкой общественности, вокруг нее успел сложиться очень мощный и развитый сектор серверных технологий, включающий помимо EJB такие технологие как: сервлеты (servlets), JMS (Java Messaging Service), JSP (Java Server Pages), JCA (Java Connectors Architecture), JDBC (Java Database Connectivity), JAAS (Java Authorization & Authentication System), а также технологии управления транзакциями и многие другие. Наличие всех этих технологией, к тому-же объединенных общей идеологией делает платформу J2EE в целом и технологию EJB в частности, крайне привлекательным решением.
2. ТехнологиюТехнологию EJBEJB
(Enterprise Java(Enterprise Java
Beans)Beans) можно рассматривать с двух точек зрения: какможно рассматривать с двух точек зрения: как фреймворкфреймворк, и, и
каккак компоненткомпонент..
С точкиС точки зрениязрения компонентакомпонента EJBEJB - это всего-лишь- это всего-лишь
надстройканадстройка над POJO-классом, описываемая с помощьюнад POJO-классом, описываемая с помощью
аннотациианнотации((
POJO это просто класс Java, который:POJO это просто класс Java, который:
1. Содержит только поля, без логики их обработки;1. Содержит только поля, без логики их обработки;
2. Доступ ко все полям только через get/set2. Доступ ко все полям только через get/set ))..
Существует три типа компонентов EJB:Существует три типа компонентов EJB:
session beanssession beans - используется для описания бизнесс-логики- используется для описания бизнесс-логики
приложенияприложения
message-driven beansmessage-driven beans - так же используется для бизнесс-- так же используется для бизнесс-
логикилогики
entitiesentities - используется для хранения данных- используется для хранения данных
С точки зренияС точки зрения фреймворкафреймворка EJB - это технология,EJB - это технология,
предоставляющая множество готовых решений (управлениепредоставляющая множество готовых решений (управление
транзакциями, безопасность, хранение информации и т.п.)транзакциями, безопасность, хранение информации и т.п.)
3. ОсновныеОсновные
архитектуры EJBархитектуры EJB
Существует 2 основные архитектурыСуществует 2 основные архитектуры
при разработке enterprise-приложений:при разработке enterprise-приложений:
традиционная слоистая архитектуратрадиционная слоистая архитектура
(traditional layered architecture)(traditional layered architecture)
domain-driven design (DDD)domain-driven design (DDD)
4. традиционная слоистая архитектуратрадиционная слоистая архитектура
(traditional layered architecture)(traditional layered architecture) EJBEJB
4 базовых слоя4 базовых слоя : слой презентации, слой: слой презентации, слой
бизнесс-логики, слой хранения данных ибизнесс-логики, слой хранения данных и
непосредственно слой самой базы данных.непосредственно слой самой базы данных.
ОбычноОбычно слойслой презентациипрезентации реализуетсяреализуется
черезчерез web-приложениеweb-приложение (т.е. используя JSP,(т.е. используя JSP,
JSF, GWT и т.п.) илиJSF, GWT и т.п.) или web-сервисweb-сервис ..
СлойСлой бизнесс-логикибизнесс-логики является основой дляявляется основой для
enterprise-приложения. В нем описываютсяenterprise-приложения. В нем описываются
бизнесс-процессы, производится поиск,бизнесс-процессы, производится поиск,
авторизация и множество других вещей. Слойавторизация и множество других вещей. Слой
бизнесс-логики использует механизмы слоябизнесс-логики использует механизмы слоя
хранения данныххранения данных ..
Чем отличаетсяЧем отличается слойслой хранения данныххранения данных ии
слойслой базы данныхбазы данных ? Тем, что в первом? Тем, что в первом
описываются высокоуровневые объектно-описываются высокоуровневые объектно-
ориентированные механизмы для работы сориентированные механизмы для работы с
сущностями БД, в то время как второй - это исущностями БД, в то время как второй - это и
5.
6. domain-driven designdomain-driven design
(DDD)(DDD)
АрхитектураАрхитектура DDDDDD предпологает, чтопредпологает, что
объекты обладают бизнесс-логикой, а необъекты обладают бизнесс-логикой, а не
являются простой репликацией объектовявляются простой репликацией объектов
БД. Многие программисты не любятБД. Многие программисты не любят
наделять объекты логикой и создаютнаделять объекты логикой и создают
отдельный слой, называемый service layerотдельный слой, называемый service layer
илиили application layerapplication layer. Он похож на слой. Он похож на слой
бизнесс-логики традиционной слоистойбизнесс-логики традиционной слоистой
архитектуры за тем лишь отличием, что онархитектуры за тем лишь отличием, что он
намногонамного тоньщетоньще..
7.
8.
9. Сервер приложений j2ee состоит изСервер приложений j2ee состоит из
двух основных элементов:двух основных элементов: контейнерконтейнер
webweb-приложения (JSP, JSF и т.д.) и-приложения (JSP, JSF и т.д.) и
EJB-контейнерEJB-контейнер.. Первый служит дляПервый служит для
создания пользовательскогосоздания пользовательского
интерфейса и слабо подходит дляинтерфейса и слабо подходит для
описания бизнес-логики приложения.описания бизнес-логики приложения.
Для этого используется вторая частьДля этого используется вторая часть
J2EE - EJB.J2EE - EJB.
10.
11.
12. Session beanSession bean
Session beanSession bean представляет собой EJB-компоненту,представляет собой EJB-компоненту,
связанную с одним клиентом. ``Бины'' этого типа, каксвязанную с одним клиентом. ``Бины'' этого типа, как
правило, имеют ограниченный срок жизни (хотя это и неправило, имеют ограниченный срок жизни (хотя это и не
обязательно), и редко участвуют в транзакциях. Вобязательно), и редко участвуют в транзакциях. В
частности, они обычно не восстанавливаются после сбоячастности, они обычно не восстанавливаются после сбоя
сервера. В качестве примера session bean можно взятьсервера. В качестве примера session bean можно взять
``бин'', который живет в веб-сервере и динамически``бин'', который живет в веб-сервере и динамически
создает HTML-страницы клиенту, при этом следя за тем,создает HTML-страницы клиенту, при этом следя за тем,
какая именно страница загружена у клиента. Когда жекакая именно страница загружена у клиента. Когда же
пользователь покидает вэб-узел, или по истечениипользователь покидает вэб-узел, или по истечении
некоторого времени, session bean уничтожается.некоторого времени, session bean уничтожается.
Несмотря на то, что в процессе своей работы, sessionНесмотря на то, что в процессе своей работы, session
bean мог сохранять некоторую информацию в базеbean мог сохранять некоторую информацию в базе
данных, его предназачение заключается все-таки не вданных, его предназачение заключается все-таки не в
отображении состояния или в работе с ``вечнымиотображении состояния или в работе с ``вечными
объектами'', а просто в выполнении некоторых функцийобъектами'', а просто в выполнении некоторых функций
на стороне сервера от имени одного клиента.на стороне сервера от имени одного клиента.
13. Session beanSession bean
В качестве session bean может выступать обычныйВ качестве session bean может выступать обычный
класс Java удовлетворяющий следующимкласс Java удовлетворяющий следующим
условиям:условиям:
иметь как минимум один методиметь как минимум один метод
не должен быть абстрактнымне должен быть абстрактным
иметь конструктор по-умолчаниюиметь конструктор по-умолчанию
методы не должны начинаться с "ejb" (напримерметоды не должны начинаться с "ejb" (например
ejbCreate, ejbDoSomething)ejbCreate, ejbDoSomething)
ДляДля stateful-биновstateful-бинов существует еще одно условие:существует еще одно условие:
свойства класса должны быть объявленысвойства класса должны быть объявлены
примитивами или реализовывать интерфейспримитивами или реализовывать интерфейс
Serializable.Serializable.
14. Особенности stateless иОсобенности stateless и
stateful биновstateful бинов
Один bean может содержать множествоОдин bean может содержать множество
клиентских методов. Этот момент являетсяклиентских методов. Этот момент является
важным для производительности, так какважным для производительности, так как
контейнер помещает экземплярыконтейнер помещает экземпляры statelessstateless--
бинов в общее хранилище и множествобинов в общее хранилище и множество
клиентов могут использовать одинклиентов могут использовать один
экземпляр бина.экземпляр бина.
В отличии от statelessВ отличии от stateless statefulstateful биныбины
инстанцируются для каждого пользователяинстанцируются для каждого пользователя
отдельно.отдельно.
15. Entity beanEntity bean
Entity beanEntity bean, наоборот, представляет собой, наоборот, представляет собой
компоненту, работающую с постояннойкомпоненту, работающую с постоянной
(persistent) информацией, хранящейся,(persistent) информацией, хранящейся,
например, в базе данных. Entity beansнапример, в базе данных. Entity beans
ассоциируются с элементами баз данных иассоциируются с элементами баз данных и
могут быть доступны одновременномогут быть доступны одновременно
нескольким пользователям. Так какнескольким пользователям. Так как
информация в базе данных являетсяинформация в базе данных является
постоянной, то и entity beans живутпостоянной, то и entity beans живут
постоянно, ``выживая'', тем самым, послепостоянно, ``выживая'', тем самым, после
сбоев сервера (когда серверсбоев сервера (когда сервер
восстанавливается после сбоя, он можетвосстанавливается после сбоя, он может
восстановить ``бин'' из базы данных).восстановить ``бин'' из базы данных).
16.
17. EJB-компонента (TheEJB-компонента (The
Enterprise JavaBeansEnterprise JavaBeans
component)component)
Отдельная EJB-компонента представляет цобойОтдельная EJB-компонента представляет цобой
компоненту в том же смысле что и традиоционныйкомпоненту в том же смысле что и традиоционный
JavaBeans ``bean'' (``зерно''). Компоненты EJB выполняютсяJavaBeans ``bean'' (``зерно''). Компоненты EJB выполняются
внутри EJB-внутри EJB-контейнераконтейнера, который, в свою очередь,, который, в свою очередь,
выполняется внутри EJB-выполняется внутри EJB-серверасервера. Любой сервер, который в. Любой сервер, который в
состоянии поддерживать EJB-контейнеры и предоставлятьсостоянии поддерживать EJB-контейнеры и предоставлять
им необходимые сервисы, может быть EJB-сервером (тоим необходимые сервисы, может быть EJB-сервером (то
есть многие из существующих серверов могут быть простоесть многие из существующих серверов могут быть просто
расширены до поддержки Enterprise JavaBeans).расширены до поддержки Enterprise JavaBeans).
EJB-компонента представляет из себя Java-класс, которыйEJB-компонента представляет из себя Java-класс, который
реализует некоторую бизнес-логику. Все остальные классыреализует некоторую бизнес-логику. Все остальные классы
в EJB-системе либо реализуют поддержку клиент/серверв EJB-системе либо реализуют поддержку клиент/сервер
взаимодйествий между компонентами, либо реализуютвзаимодйествий между компонентами, либо реализуют
некоторые сервисы для компонент.некоторые сервисы для компонент.
18. EJB-контейнер (TheEJB-контейнер (The
Enterprise JavaBeansEnterprise JavaBeans
container)container)
EJB-контейнер -- это то место, где ``живет'' EJB-компонент.EJB-контейнер -- это то место, где ``живет'' EJB-компонент.
EJB-контейнер реализует для находящихся в немEJB-контейнер реализует для находящихся в нем
компонент такие сервисы как транзакции (transaction),компонент такие сервисы как транзакции (transaction),
управление ресурсами, управление версиями компонент,управление ресурсами, управление версиями компонент,
их мобильностью, настраиваемостью, мобильностью,их мобильностью, настраиваемостью, мобильностью,
жизненным циклом. Так как EJB-контейнер реализует всежизненным циклом. Так как EJB-контейнер реализует все
эти функции, то разработчик EJB-компонент может неэти функции, то разработчик EJB-компонент может не
реализовывать их самостоятельно, а просто вызыватьреализовывать их самостоятельно, а просто вызывать
соответсвующие методы у контейнера (правила вызовасоответсвующие методы у контейнера (правила вызова
методов у контейнера описываются в спецификации). Какметодов у контейнера описываются в спецификации). Как
правило, в одном EJB-контейнере живет несколькоправило, в одном EJB-контейнере живет несколько
однотипных EJB-компонент.однотипных EJB-компонент.
19. EJB-объект (EJB-object)EJB-объект (EJB-object)
и удаленный интерфейси удаленный интерфейс
(remote interface)(remote interface)
Клиентские приложения вызывают методы наКлиентские приложения вызывают методы на
удаленных EJB-компонентах через EJB-объектудаленных EJB-компонентах через EJB-объект
(EJB-object). EJB-объект реализует ``удаленный(EJB-object). EJB-объект реализует ``удаленный
интерфейс'' EJB-компоненты на сервере. Суть винтерфейс'' EJB-компоненты на сервере. Суть в
том, что находящаяся на сервере EJB-компонента,том, что находящаяся на сервере EJB-компонента,
помимо бизнес-функций, ради которых она былапомимо бизнес-функций, ради которых она была
разработана, должна реализовывать такжеразработана, должна реализовывать также
некоторые функции, определяемыенекоторые функции, определяемые
спецификацией, которые служат для ``управления''спецификацией, которые служат для ``управления''
EJB-компонентой со стороны контейнера. EJB-EJB-компонентой со стороны контейнера. EJB-
объект реализует лишь бизнес-интерфейс дляобъект реализует лишь бизнес-интерфейс для
EJB-компоненты, являясь, в некотором смысле,EJB-компоненты, являясь, в некотором смысле,
``промежуточным'' звеном между клиентом и EJB-``промежуточным'' звеном между клиентом и EJB-
компонентой.компонентой.
20. EJB-компонентаEJB-компонента
выполняется навыполняется на
сервере, внутри EJB-сервере, внутри EJB-
контейнера и реализуетконтейнера и реализует
бизнес-логику, в тобизнес-логику, в то
время как EJB-объектвремя как EJB-объект
выполняется у клиентавыполняется у клиента
и удаленно вызываети удаленно вызывает
методы у EJB-методы у EJB-
компоненты.компоненты.
21.
22. Итак, приложение-клиент соединяется с EJB-Итак, приложение-клиент соединяется с EJB-
сервером и посылает ему запрос на созданиесервером и посылает ему запрос на создание
``бина'' (Enterprise JavaBean) для обработки``бина'' (Enterprise JavaBean) для обработки
своих запросов. Сервер отвечает на такой запроссвоих запросов. Сервер отвечает на такой запрос
созданием объекта на стороне серверасозданием объекта на стороне сервера
(экземпляр EJB-компоненты) и возвращает(экземпляр EJB-компоненты) и возвращает
клиенту прокси-объект (EJB-объект), чейклиенту прокси-объект (EJB-объект), чей
итерфейс совпадает с интерфейсом созданнойитерфейс совпадает с интерфейсом созданной
EJB-компоненты и чьи методы перенаправляютEJB-компоненты и чьи методы перенаправляют
вызовы собственно экземпляру компоненты.вызовы собственно экземпляру компоненты.
После этого приложение-клиент работает с EJB-После этого приложение-клиент работает с EJB-
объектом как с локальным объектом, даже и необъектом как с локальным объектом, даже и не
подозревая, что всю работу выполняет не EJB-подозревая, что всю работу выполняет не EJB-
объект, а удаленная компонента на сервере.объект, а удаленная компонента на сервере.
Необходимо заметить, что созданием иНеобходимо заметить, что созданием и
удалением EJB-компонент на сервереудалением EJB-компонент на сервере
занимается EJB-контейнер.занимается EJB-контейнер.
23.
24. POJO, POJI,POJO, POJI,
annotationsannotations
Теперь рассмотрим реализацию этихТеперь рассмотрим реализацию этих
сущностей. В EJB3 мы используемсущностей. В EJB3 мы используем
POJOPOJO (Plain Old Java Objects),(Plain Old Java Objects), POJIPOJI
(Plain Old Java Interfaces) и(Plain Old Java Interfaces) и
аннотациианнотации..
Аннотация записывается так:Аннотация записывается так:
@<имя аннотации>(<список парамет-@<имя аннотации>(<список парамет-
значение>)значение>)
25. Какие аннотации могут быть?Какие аннотации могут быть?
StatelessStateless - говорит контейнеру, что класс будет stateless session- говорит контейнеру, что класс будет stateless session
bean. Для него контейнер обеспечит безопасность потоков иbean. Для него контейнер обеспечит безопасность потоков и
менеджмент транзакций. Дополнительно, вы можете добавитьменеджмент транзакций. Дополнительно, вы можете добавить
другие свойства, например прозрачное управление безопасностью идругие свойства, например прозрачное управление безопасностью и
перехватчики событий;перехватчики событий;
LocalLocal - относится к интерфейсу и говорит, что bean реализующий- относится к интерфейсу и говорит, что bean реализующий
интерфейс доступен локальноинтерфейс доступен локально
RemoteRemote - относится к интерфейсу и говорит, что bean доступен через- относится к интерфейсу и говорит, что bean доступен через
RMI (Remote Method Invocation)RMI (Remote Method Invocation)
EJBEJB - применятеся в коде, где мы используем bean.- применятеся в коде, где мы используем bean.
StatefulStateful - говорит контейнеру, что класс будет stateful session bean.- говорит контейнеру, что класс будет stateful session bean.
RemoveRemove - опциональная аннотация, которая используется с stateful- опциональная аннотация, которая используется с stateful
бинами. Метод, помеченный как Remove говорит контейнеру, чтобинами. Метод, помеченный как Remove говорит контейнеру, что
после его исполнения нет больше смысла хранить bean, т.е. егопосле его исполнения нет больше смысла хранить bean, т.е. его
состояние сбрасывается. Это бывает критично длясостояние сбрасывается. Это бывает критично для
производительности.производительности.
EntityEntity - говорит контейнеру, что класс будет сущностью БД- говорит контейнеру, что класс будет сущностью БД
TableTable(name="...")(name="...") - указывает таблицу для маппинга- указывает таблицу для маппинга
IdId,, ColumnColumn - параметры маппинга- параметры маппинга
WebServiceWebService - говорит, что интерфейс или класс будет представлять- говорит, что интерфейс или класс будет представлять
вэб-сервис.вэб-сервис.
и много-много других...и много-много других...
26.
27. POJO, POJI,POJO, POJI,
annotationsannotations
УУ statelessstateless ии MDBMDB бинов существуетбинов существует 22
событиясобытия жизненного цикла, которые мыжизненного цикла, которые мы
можем перехватить: создание и удалениеможем перехватить: создание и удаление
бина. Метод, который будет вызыватьсябина. Метод, который будет вызываться
сразу после создании бина помечаетсясразу после создании бина помечается
аннотацией javax.annotation.аннотацией javax.annotation.PostConstructPostConstruct, а, а
перед его удалением -перед его удалением -
javax.annotation.javax.annotation.PreDestroyPreDestroy.. StatefulStateful биныбины
обладают помимо рассмотреных вышеобладают помимо рассмотреных выше ещееще
2 событиями2 событиями: при активации: при активации
(javax.ejb.(javax.ejb.PostActivatePostActivate) и при деактивации) и при деактивации
(javax.ejb.(javax.ejb.PrePassivatePrePassivate).).
28. importimport javax.ejb.Local;javax.ejb.Local;
@Local@Local
public interfacepublic interface BookTestBeanLocal {BookTestBeanLocal {
public voidpublic void test();test();
}}
------------------------------------------------------------------------------------------------------------
importimport javax.ejb.Remote;javax.ejb.Remote;
@Remote@Remote
public interfacepublic interface BookTestBeanRemote {BookTestBeanRemote {
public voidpublic void test();test();
}}
29.
30.
31.
32.
33. Перехватчики(Перехватчики( interceptointercepto
rsrs))
При создании enterprise-приложений частоПри создании enterprise-приложений часто
возникает необходимость записывать логвозникает необходимость записывать лог
вызываемых методов (в целях отладки иливызываемых методов (в целях отладки или
для лога безопасности), а так жедля лога безопасности), а так же
контролировать доступ пользователей кконтролировать доступ пользователей к
отдельным частям приложения. Для этогоотдельным частям приложения. Для этого
используютсяиспользуются перехватчикиперехватчики - объекты,- объекты,
методы которых вызываютсяметоды которых вызываются
автоматическиавтоматически припри вызовевызове методаметода EJBEJB--
бина.бина.
34. Перехватчики(Перехватчики( interceptointercepto
rsrs))
Объект-перехватчик является POJO,Объект-перехватчик является POJO,
за тем лишь исключением, что метод,за тем лишь исключением, что метод,
который должен вызыватьсякоторый должен вызываться
автоматически аннотируетсяавтоматически аннотируется
@AroundInvoke@AroundInvoke