Obecnie jest to rzeczywiście trochę zagmatwane, ponieważ w Javie EE jest teraz wiele modeli komponentów. Są to fasole zarządzane CDI , EJB3 i JSF .
CDI to nowy dzieciak w okolicy. CDI wyposażone fasola dependency injection
, scoping
i event bus
. Ziarna CDI są najbardziej elastyczne pod względem wstrzykiwania i określania zakresu. Magistrala zdarzeń jest bardzo lekka i bardzo dobrze nadaje się do nawet najprostszych aplikacji internetowych. Oprócz tego CDI udostępnia również bardzo zaawansowaną funkcję o nazwie portable extensions
, która jest rodzajem mechanizmu wtyczek dla dostawców w celu zapewnienia dodatkowej funkcjonalności dla Java EE, którą można udostępnić we wszystkich implementacjach (Glassfish, JBoss AS, Websphere itp.) .
Komponenty EJB3 zostały zmodernizowane ze starego modelu komponentów EJB2 * i były pierwszymi komponentami Java EE zarządzanymi za pomocą adnotacji. EJB3 fasoli wyposażone dependency injection
, declarative transactions
, declarative security
, pooling
, concurrency control
, asynchronous execution
i remoting
.
Wstrzykiwanie zależności w ziarnach EJB3 nie jest tak elastyczne, jak w ziarnach CDI, a ziarna EJB3 nie mają koncepcji zakresu. Jednak ziarna EJB3 są domyślnie transakcyjne i łączone ** , dwie bardzo użyteczne rzeczy, które CDI zdecydowało się pozostawić w domenie EJB3. Pozostałe wymienione pozycje również nie są dostępne w CDI. EJB3 nie ma jednak własnej magistrali zdarzeń, ale ma specjalny typ ziarna do odsłuchiwania komunikatów; fasola sterowana wiadomością. Może to służyć do odbierania komunikatów z systemu Java Messaging System lub z dowolnego innego systemu wyposażonego w adapter zasobów JCA. Używanie pełnowartościowych komunikatów do prostych zdarzeń jest znacznie cięższe niż magistrala zdarzeń CDI, a EJB3 definiuje tylko odbiornik, a nie interfejs API producenta.
JSF Managed Beans istniało w Javie EE od czasu dołączenia JSF. One też posiadają dependency injection
i scoping
. JSF Managed Beans wprowadziło koncepcję deklaratywnego określania zakresu. Początkowo zakresy były raczej ograniczone, aw tej samej wersji Java EE, w której komponenty bean EJB3 można było już deklarować za pomocą adnotacji, nadal trzeba było zadeklarować w formacie XML Managed Beans. Bieżąca wersja JSF Managed Beans jest również ostatecznie deklarowana za pomocą adnotacji, a zakresy są rozszerzane o zakres widoku i możliwość tworzenia niestandardowych zakresów. Zakres widoku, który zapamiętuje dane między żądaniami do tej samej strony, jest unikalną cechą JSF Managed Beans.
Poza zakresem widoku, niewiele jest jeszcze dla JSF Managed Beans w Java EE 6. Brakujący zakres widoku w CDI jest niefortunny, ponieważ w przeciwnym razie CDI byłby idealnym super zestawem tego, co oferuje JSF Managed Beans. Aktualizacja : W Javie EE 7 / JSF 2.2 dodano kompatybilny z CDI @ViewScoped , dzięki czemu CDI jest rzeczywiście doskonałym super zestawem. Aktualizacja 2 : W JSF2.3 komponenty bean zarządzane przez JSF zostały uznane za przestarzałe na rzecz komponentów bean zarządzanych przez CDI.
W przypadku EJB3 i CDI sytuacja nie jest tak jednoznaczna. Model komponentów i API EJB3 oferuje wiele usług, których CDI nie oferuje, więc zazwyczaj EJB3 nie może zostać zastąpiony przez CDI. Z drugiej strony CDI może być używany w połączeniu z EJB3 - np. Dodając obsługę zakresu do EJB.
Reza Rahman, członek grupy ekspertów i twórca implementacji CDI o nazwie CanDI, często sugerował, że usługi związane z modelem komponentu EJB3 można doposażyć w zestaw adnotacji CDI. Gdyby tak się stało, wszystkie zarządzane ziarna w Java EE mogłyby stać się fasolami CDI. Nie oznacza to, że EJB3 znika lub staje się przestarzały, ale tylko, że jego funkcjonalność zostanie ujawniona za pośrednictwem CDI, a nie za pośrednictwem własnych adnotacji EJB, takich jak @Stateless i @EJB.
Aktualizacja
David Blevins z TomEE i sławy OpenEJB bardzo dobrze wyjaśnia różnice i podobieństwa między CDI i EJB na swoim blogu: CDI, kiedy wyrwać się z EJB
* Chociaż jest to tylko wzrost numeru wersji, ziarna EJB3 były w większości zupełnie innym rodzajem ziarna: prostym pojo, które staje się „zarządzanym ziarnem” przez zastosowanie prostej pojedynczej adnotacji, w porównaniu z modelem w EJB2, gdzie waga ciężka i zbyt szczegółowy deskryptor wdrażania XML był wymagany dla każdego komponentu bean, oprócz tego, że był on wymagany do implementacji różnych bardzo ciężkich i w większości bezsensownych interfejsów komponentów.
** Bezstanowe komponenty bean sesji są zwykle łączone, stanowe komponenty bean sesji zwykle nie (ale mogą być). W przypadku obu typów pulowanie jest zatem opcjonalne, a specyfikacja EJB nie narzuca tego ani w żaden sposób.