В настоящее время это действительно немного сбивает с толку, поскольку в Java EE теперь есть несколько компонентных моделей. Это CDI , EJB3 и Управляемые бобы JSF .
CDI - новый ребенок на блоке. Компоненты CDI имеют dependency injection
, scoping
и event bus
. Бобы CDI являются наиболее гибкими в отношении инъекций и определения объема. Шина событий очень легкая и очень хорошо подходит даже для самых простых веб-приложений. В дополнение к этому, CDI также предоставляет очень продвинутую функцию под названием portable extensions
, которая является своего рода механизмом плагинов для поставщиков, обеспечивающим дополнительную функциональность для Java EE, которая может быть доступна во всех реализациях (Glassfish, JBoss AS, Websphere). и т. д.).
EJB3 bean-компоненты были модифицированы из старой унаследованной компонентной модели EJB2 * и были первыми bean-компонентами в Java EE, которые стали управлять bean-компонентами посредством аннотации. EJB3-компоненты имеют функции dependency injection
, declarative transactions
, declarative security
, pooling
, concurrency control
, asynchronous execution
и remoting
.
Внедрение зависимостей в EJB3-бины не так гибко, как в CDI-бинах и EJB3-бинах, не имеющих понятия области видимости. Однако EJB3-компоненты являются транзакционными и объединяются по умолчанию **, две очень полезные вещи, которые CDI решил оставить в домене EJB3. Другие упомянутые элементы также не доступны в CDI. EJB3 не имеет собственной шины событий, но у него есть специальный тип bean для прослушивания сообщений; бин, управляемый сообщениями. Это можно использовать для получения сообщений из системы обмена сообщениями Java или любой другой системы, имеющей адаптер ресурсов JCA. Использование полноценного обмена сообщениями для простых событий гораздо тяжелее, чем шина событий CDI, а EJB3 определяет только слушателя, а не API-производитель.
Управляемые компоненты JSF существуют в Java EE с момента включения JSF. Они тоже имеют dependency injection
и scoping
. JSF Managed Beans представила концепцию декларативного определения объема. Первоначально области действия были довольно ограничены, и в той же версии Java EE, где EJB3-бины уже могли быть объявлены с помощью аннотаций, JSF Managed Beans все еще нужно было объявлять в XML. Текущая версия JSF Managed Beans также, наконец, объявляется с помощью аннотации, и области видимости расширяются за счет области просмотра и возможности создания пользовательских областей. Область представления, которая запоминает данные между запросами к одной и той же странице , является уникальной функцией JSF Managed Beans.
Помимо области представления, для JSF Managed Beans в Java EE 6 еще очень мало. Отсутствует область представления в CDI, что вызывает сожаление, поскольку в противном случае CDI был бы идеальным супер-набором того, что предлагают JSF Managed Beans , Обновление : В Java EE 7 / JSF 2.2 был добавлен CDI-совместимый @ ViewScoped , что делает CDI действительно идеальным супер-набором. Обновление 2 : В JSF2.3 управляемые bean-компоненты JSF устарели в пользу управляемых bean-компонентов CDI.
С EJB3 и CDI ситуация не такая четкая. Компонентная модель и API EJB3 предлагает множество сервисов, которые CDI не предлагает, поэтому обычно EJB3 не может быть заменен CDI. С другой стороны, CDI можно использовать в сочетании с EJB3 - например, добавление поддержки областей в EJB.
Реза Рахман, член экспертной группы и разработчик реализации CDI под названием CanDI, часто намекнул, что сервисы, связанные с компонентной моделью EJB3, могут быть модифицированы как набор аннотаций CDI. Если это произойдет, все управляемые bean-компоненты в Java EE могут стать bean-компонентами CDI. Это не означает, что EJB3 исчезает или становится устаревшим, но просто то, что его функциональность будет отображаться через CDI, а не через собственные аннотации EJB, такие как @Stateless и @ EJB.
Update
Дэвид Блевинс из TomEE и OpenEJB очень хорошо объясняет различия и сходства между CDI и EJB в своем блоге: CDI, когда открывать EJBs
*Хотя это просто увеличение номера версии, EJB3-компоненты были по большей части совершенно другим видом bean-компонента: простой pojo, который становится «управляемым bean-компонентом» путем применения простой одиночной аннотации, по сравнению с моделью в EJB2, где тяжелый и чрезмерно избыточный подробный XML-дескриптор развертывания был необходим для каждого компонента, в дополнение к компоненту, необходимому для реализации различных чрезвычайно тяжеловесных и по большей части бессмысленных интерфейсов компонентов.
** Сессионные компоненты без сохранения состояния обычно объединяются, сессионные компоненты с сохранением состояния обычно не (но они могут быть). Таким образом, для обоих типов пул является необязательным, и спецификация EJB не требует его в любом случае.