Наразі це справді трохи заплутано, оскільки зараз у Java EE є багатокомпонентні моделі. Це CDI , EJB3 та JSF Managed Beans .
CDI - це нова дитина на блоці. КДІ боби мають dependency injection
, scoping
і event bus
. CDI-боби є найбільш гнучкими щодо ін'єкцій та їх застосування. Шина заходу дуже легка і дуже добре підходить навіть для найпростіших веб-додатків. На додаток до цього, CDI також пропонує дуже вдосконалену функцію під назвою portable extensions
, яка є своєрідним механізмом підключення для постачальників для надання додаткової функціональності Java EE, яка може бути доступною для всіх реалізацій (Glassfish, JBoss AS, Websphere тощо) .
Боби EJB3 були модернізовані зі старої застарілої моделі компонентів EJB2 * і були першими бобами в Java EE, якими керували бобами за допомогою анотації. EJB3 боби мають dependency injection
, declarative transactions
, declarative security
, pooling
, concurrency control
, asynchronous execution
і remoting
.
Ін'єкційна залежність в зернах EJB3 не така гнучка, як у квасолі CDI, а EJB3 в бобах не має поняття визначення обсягу. Однак боби EJB3 є транзакційними та об'єднаними за замовчуванням ** , дві дуже корисні речі, які CDI вирішив залишити у домені EJB3. Інші згадані елементи також відсутні в CDI. EJB3 не має власної шини подій, але він має особливий тип боб для прослуховування повідомлень; повідомлення, кероване бобом. Це можна використовувати для отримання повідомлень із системи обміну повідомленнями 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 Managed Beans. Оновлення : у Java EE 7 / JSF 2.2 додано сумісний з CDI @ViewScoped , що робить CDI справді ідеальним супер набором. Оновлення 2 : У JSF2.3 квасоля, що керується JSF, була присуджена на користь бобів, що керуються CDI.
З EJB3 та CDI ситуація не настільки чітка. Модель компонентів і API EJB3 пропонує безліч послуг, які CDI не пропонує, тому зазвичай EJB3 не може бути замінений CDI. З іншого боку, CDI можна використовувати в поєднанні з EJB3 - наприклад, додаючи підтримку обсягу до EJB.
Реза Рахман, член експертної групи та реалізатор впровадження CDI під назвою CanDI, часто натякає, що послуги, пов'язані з компонентною моделлю EJB3, можуть бути оновлені як набір анотацій CDI. Якби це сталося, усі керовані боби в Java EE можуть стати CDI-бобами. Це не означає, що EJB3 зникає або застаріває, але просто те, що його функціональність буде відкрита через CDI замість власних приміток EJB, таких як @Stateless та @EJB.
Оновлення
Девід Блевінс із слави TomEE та OpenEJB дуже добре пояснює відмінності та схожість між CDI та EJB у своєму блозі: CDI, коли потрібно вибувати з EJB
* Хоча це лише приріст кількості версії, боби EJB3 здебільшого були абсолютно іншим видом бобів: простий пуджо, який стає "керованим бобом", застосовуючи просту одиночну анотацію, порівняно з моделлю в EJB2, де важковаговик і дескриптор розгортання XML був потрібний для кожного компонента, на додаток до бону, необхідного для впровадження різних надзвичайно важких і здебільшого безглуздих компонентних інтерфейсів.
** Бобові сеанси без громадянства, як правило, об'єднані, боби, що належать до сеансів, зазвичай не є (але вони можуть бути) Таким чином, об'єднання обох типів є необов'язковим, і специфікація EJB не вимагає цього.