Как сравнить CDI и EJB? взаимодействовать?


Мне трудно понять, как эти два взаимодействуют и где граница между ними лежит. Они пересекаются? Есть ли между ними избыточность?

Я знаю, что есть аннотации, связанные с обоими, но я не смог найти полный список с краткими описаниями. Не уверен, что это поможет прояснить, как они отличаются или где они перекрываются.

на самом деле просто запутался. Я (думаю, что я) понимаю EJB достаточно хорошо, я думаю, что у меня есть трудно понять, что именно CDI приносит в таблицу и как он вытесняет или усиливает то, что EJB уже предлагает.

3 102

3 ответа:

CDI-речь идет о инъекции зависимостей. Это означает, что вы можете внедрить реализацию интерфейса в любом месте. Этот объект может быть любым, он может быть не связан с EJB. здесь является примером того, как ввести генератор случайных чисел с помощью CDI. Там нет ничего о EJB. Вы собираетесь использовать CDI, когда хотите внедрить не-EJB-сервисы, различные реализации или алгоритмы (поэтому вам вообще не нужен EJB).
EJB вы понимаете, и, вероятно, вас смущает @EJB аннотация-это позволяет вам внедрить реализацию в свой сервис или что-то еще. Основная идея заключается в том, что класс, в который вы вводите, должен управляться контейнером EJB. Кажется, что CDI понимает, что такое EJB, поэтому в Java EE 6 совместимый сервер, в вашем сервлете вы можете написать оба

@EJB EJBService ejbService;

и

@Inject EJBService ejbService;

это то, что может сбить вас с толку, но это, вероятно, единственное, что является мостом между EJB и CDI.

когда мы говорим о CDI, вы можете вводить другие объекты в управляемые классы CDI (они просто должны быть созданы фреймворками с поддержкой CDI).

что еще предлагает CDI... Например, вы используете Struts 2 в качестве платформы MVC (просто пример), и вы ограничены здесь, даже используя EJB 3.1 - вы не можете использовать аннотацию @EJB в действии Struts, она не управляется контейнером. Но когда вы добавляете плагин Struts2-CDI, вы можете написать там аннотацию @Inject для того же самого (поэтому больше не требуется поиск JNDI). Таким образом, он повышает EJB сила. Но как я уже упоминал ранее, то, что вы вводите с CDI - это не имеет значения, связано ли это с EJB или нет, и это его сила

PS. обновлена ссылка на пример

в настоящее время это действительно немного запутанно, поскольку в Java EE теперь есть несколько моделей компонентов. Они CDI,EJB3 и JSF управляемые бобы.

CDI это новый ребенок на блоке. КДИ фасоли характеристика dependency injection,scoping и event bus. Фасоли CDI самые гибкие по отношению к впрыске и определять объем. Шина событий очень легкая и очень хорошо подходит даже для самых простых веб-приложений. В в дополнение к этому, CDI также предоставляет очень продвинутую функцию под названием portable extensions, который является своего рода механизмом плагина для поставщиков, чтобы обеспечить дополнительную функциональность Java EE, которая может быть доступна на всех реализациях (Glassfish, JBoss AS, Websphere и т. д.).

EJB3 бобы были переоборудованы из старой модели компонентов legacy EJB2* и были первыми бобами в Java EE, которые будут управляться бобами через аннотацию. 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 все еще должны были быть объявлены в XML. Текущая версия управляемых компонентов JSF также окончательно объявляется с помощью аннотации, а области расширяются с помощью области представления и возможностью создания пользовательских областей. Область представления, которая запоминает данные между запросами к то же самое страница является уникальной особенностью JSF Управляемые Бобы.

помимо области видимости, в Java EE 6 очень мало еще происходит для управляемых компонентов JSF. Отсутствующая область видимости в CDI там неудачна, так как в противном случае CDI был бы идеальным супер набором того, что предлагают управляемые бобы JSF. обновление: в Java EE 7 / JSF 2.2 a CDI совместимый @ViewScoped был добавлен, что делает КДИ действительно великолепный набор. обновление 2: в JSF2.3 управляемые компоненты JSF были устарел в пользу CDI управляемых бобов.

С EJB3 и CDI ситуация не так ясна. Компонентная модель EJB3 и API предлагает множество услуг, которые CDI не предлагает, поэтому обычно EJB3 не может быть заменен CDI. С другой стороны, CDI может использоваться в сочетании с EJB3 - например, добавление поддержки области к EJBs.

Реза Рахман, член экспертной группы и исполнитель реализации CDI под названием CanDI, часто намекал, что услуги связанный с компонентной моделью EJB3 может быть модифицирован как набор аннотаций CDI. Если бы это произошло, все управляемые бобы в Java EE могли бы стать бобами CDI. Это не означает, что EJB3 исчезает или устаревает, но просто его функциональность будет отображаться через CDI вместо собственных аннотаций EJB, таких как @Stateless и @EJB.

обновление

Дэвид Блевинс из TomEE и OpenEJB славы объясняет различия и сходства между CDI и EJB очень хорошо на своем блоге:CDI, когда вырваться из EJBs

* Хотя это всего лишь увеличение номера версии, бобы EJB3 были по большей части совершенно другим видом бобов: простой pojo, который становится "управляемым Бобом", применяя простую одиночную аннотацию, против модели в EJB2, где для каждого Боба требовался тяжелый и чрезмерно подробный дескриптор развертывания XML, в дополнение к тому, что Боб требуется для реализации различные чрезвычайно тяжелые и по большей части бессмысленные интерфейсы компонентов.

** сеансовые компоненты без состояния обычно объединяются в пул, сеансовые компоненты с сохранением состояния обычно нет (но они могут быть). Таким образом, для обоих типов объединение в пул является необязательным, и спецификация EJB не требует его в любом случае.

Альберт Эйнштейн: If you can't explain it simply, you don't understand it well enough

Ejbs и CDI довольно просты для понимания.

Ejbs:

  1. всегда будет аннотироваться квалификаторами области, например, @stateful, @Request и т. д.
  2. экземпляры Ejbs управляются Java EE framework и объединяются в пул. Это обязанность ee framework предоставлять экземпляры для потребителя.

@Stateless

 public class CarMaker(){
    public void createCar(Specification specs){
        Car car = new Car(specs);
    }
}

автопроизводитель Аннотированный с определенным объемом Ejbs, поэтому, это Ejb

CDI:

  1. не управляется полностью ee framework, экземпляры должны быть созданы самостоятельно.
  2. это всегда зависимый. позвольте мне объяснить "зависимый" с примером:

    class Specification { private String color; private String model; //- Getter and Setter }

The Specification класс CDI, так как он не аннотируется областями Ejb, а также это должно быть инициализировано вашим кодом, а не ee framework. Один момент, который следует отметить вот что, так как мы не Аннотировали Specification класс, он по умолчанию Аннотируется @Dependent Примечание.

@Dependent  <- By default added 
class Specification { ... }

Further reading: вам нужно изучить больше между аннотацией ejbs scope и аннотацией CDI scope, что еще больше очистит концепцию