Jak porównać CDI i EJB? interakcja?

Ciężko mi zrozumieć, w jaki sposób te dwie osoby wchodzą w interakcję i gdzie leży granica między nimi. Pokrywają się? Czy są między nimi zwolnienia?

Wiem, że są adnotacje związane z obydwoma, ale nie byłem w stanie znaleźć pełnej listy dla obu z krótkimi opisami. Nie jestem pewien, czy pomoże to wyjaśnić, w jaki sposób różnią się one lub gdzie się pokrywają.

Naprawdę po prostu zdezorientowany. Ja (chyba) dobrze rozumiem EJB, chyba mam problem zrozumienie, co CDI przynosi do stołu i jak zastępuje lub wzmacnia to, co już oferuje EJB.

Author: Tim, 2011-01-13

3 answers

CDI - chodzi o iniekcję zależności. Oznacza to, że można wprowadzić implementację interfejsu w dowolnym miejscu. Tym obiektem może być cokolwiek, nie może być związany z EJB. tutaj {[4] } jest przykład jak wstrzyknąć generator losowy za pomocą CDI. Nie ma nic o EJB. Będziesz używać CDI, gdy chcesz wprowadzić usługi inne niż EJB, różne implementacje lub algorytmy(więc w ogóle nie potrzebujesz EJB).
EJB rozumiesz, i pewnie jesteś zdezorientowany adnotacją @ EJB-to pozwala na wstrzyknięcie implementacji do usługi lub cokolwiek innego. Główną ideą jest to, że klasa, w której wstrzykujesz, powinna być zarządzana przez kontener EJB. Wygląda na to, że CDI rozumie czym jest EJB, więc w serwerze zgodnym z Java EE 6, w serwlecie możesz napisać zarówno

@EJB EJBService ejbService;

I

@Inject EJBService ejbService;

To może cię mylić, ale to prawdopodobnie jedyna rzecz, która jest pomostem między EJB i CDI.

Kiedy mówimy o CDI, można wprowadzić inne obiekty do CDI klasy zarządzane (powinny być tworzone przez frameworki CDI aware).

Co jeszcze oferuje CDI... Na przykład, używasz Struts 2 jako framework MVC (tylko przykład), i jesteś tutaj ograniczony, nawet używając EJB 3.1 - nie możesz używać @ EJB adnotacji w akcji Struts, nie jest ona zarządzana przez kontener. Ale kiedy dodasz wtyczkę Struts2-CDI, możesz tam napisać adnotację @ Inject dla tego samego (więc nie musisz już szukać JNDI). W ten sposób zwiększa moc EJB. Ale jak wspomniałem wcześniej, co Ty inject with CDI - nie ma znaczenia, czy jest to związane z EJB, czy nie, i to jest jego moc

PS. zaktualizowany link do przykładu

 47
Author: Maxym,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-24 07:06:07

Obecnie jest to nieco mylące, ponieważ w Java EE istnieje wiele modeli komponentów. Są CDI, EJB3 i JSF zarządzały Beans.

CDI {[15] } to nowy dzieciak w bloku. Funkcja fasoli CDIdependency injection, scoping i event bus. Fasola CDI jest najbardziej elastyczna pod względem wtrysku i zakresu. Event bus jest bardzo lekki i bardzo dobrze nadaje się do nawet najprostszych aplikacji internetowych. Oprócz tego CDI eksponuje również bardzo zaawansowana funkcja o nazwie portable extensions, która jest rodzajem mechanizmu wtyczek dla dostawców, aby zapewnić dodatkową funkcjonalność Java EE, która może być udostępniona we wszystkich implementacjach (Glassfish, JBoss AS, Websphere, itp.).

EJB3 fasola została doposażona w stary model komponentu EJB2* i były pierwszymi fasolami w Java EE, które były zarządzane fasolami poprzez adnotację. Funkcja fasoli EJB3 dependency injection, declarative transactions, declarative security, pooling, concurrency control, asynchronous execution i remoting.

Zależność Wtrysk w fasoli EJB3 nie jest tak elastyczny jak w fasoli CDI, a fasola EJB3 nie ma pojęcia zakresu. Jednak fasole EJB3 są domyślnie transakcyjne i łączone**, dwie bardzo przydatne rzeczy, które CDI zdecydowało się pozostawić w domenie EJB3. Pozostałe wymienione elementy również nie są dostępne w CDI. EJB3 nie ma własnej szyny zdarzeń, ale ma specjalny rodzaj fasoli do słuchania wiadomości; message driven bean. To może być używane do odbierania wiadomości z Java System wiadomości lub z dowolnego innego systemu, który ma Adapter zasobów JCA. Korzystanie z pełnowymiarowych komunikatów dla prostych zdarzeń jest znacznie cięższe niż szyna zdarzeń CDI, a EJB3 definiuje tylko listener, a nie producer API.

JSF Managed Beans istnieją w Java EE od momentu włączenia JSF. Posiadają również dependency injection i scoping. JSF Managed Beans wprowadził pojęcie deklaratywnego przeliczania. Pierwotnie zakres był raczej ograniczony i w tej samej wersji Java EE gdzie EJB3 beans można było już zadeklarować za pomocą adnotacji, JSF Managed Beans nadal musiał być zadeklarowany w XML. Aktualna wersja JSF Managed Beans jest również ostatecznie deklarowana poprzez adnotację, a zakresy są rozszerzane o zakres widoku i możliwość tworzenia własnych zakresów. Zakres widoku, który zapamiętuje dane pomiędzy żądaniami do tej samej strony jest unikalną cechą JSF Managed Beans.

Poza zakresem widzenia, niewiele jeszcze dzieje się dla fasoli zarządzanych przez JSF w Java EE 6. Brakujący zakres widzenia w CDI jest niefortunny, ponieważ w przeciwnym razie CDI byłby idealnym super zestawem tego, co oferuje JSF Managed Beans. Update : W Java EE 7/JSF 2.2 A CDI compatible @ViewScoped został dodany, dzięki czemu CDI rzeczywiście jest idealnym super zestawem. Update 2 : W JSF2.3 JSF managed beans zostały wycofane na rzecz CDI managed beans.

W przypadku EJB3 i CDI sytuacja nie jest tak jasna. Model komponentu EJB3 a API oferuje wiele usług, których CDI nie oferuje, więc zazwyczaj EJB3 nie może być zastąpiony przez CDI. Z drugiej strony, CDI może być używane w połączeniu z EJB3 - np. dodanie obsługi zakresu do EJB.

Reza Rahman, członek grupy ekspertów i wykonawca implementacji CDI o nazwie CanDI, często wskazywał, że usługi związane z modelem komponentów EJB3 mogą być doposażone w zestaw adnotacji CDI. Gdyby tak się stało, wszystkie managed beans w Java EE mogłyby stać się CDI fasola. Nie oznacza to, że EJB3 znika lub staje się przestarzały, ale po prostu, że jego funkcjonalność zostanie ujawniona przez CDI zamiast przez własne adnotacje EJB, takie jak @Stateless i @EJB.

Update

David Blevins z tomee and OpenEJB fame wyjaśnia różnice i podobieństwa między CDI i EJB bardzo dobrze na swoim blogu: CDI, kiedy przełamać EJB {20]}

* Chociaż to tylko przyrost numeru wersji, fasolki EJB3 były dla w większości przypadków zupełnie inny rodzaj fasoli: proste pojo, które staje się" zarządzaną fasolą " poprzez zastosowanie prostej pojedynczej adnotacji, w przeciwieństwie do modelu w EJB2, w którym wymagany był ciężki i zbyt obszerny deskryptor wdrażania XML dla każdej fasoli, oprócz tego, że fasola jest wymagana do implementacji różnych niezwykle ciężkich i w większości bezsensownych interfejsów komponentów.

** Stateless session beans są zazwyczaj zbiorcze, stateful session beans zazwyczaj nie (ale mogą być). W przypadku obu typów łączenie jest więc opcjonalne, a specyfikacja EJB nie nakazuje tego w żaden sposób.

 184
Author: Arjan Tijms,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-09 06:45:08

Albert Einstein: If you can't explain it simply, you don't understand it well enough

Ejbs i CDI są dość proste do zrozumienia.

Ejbs:

  1. będzie zawsze przypisywane kwalifikatorami zakresu, na przykład @Stateless, @Stateful, @Request itp
  2. instancje EJB są kontrolowane przez Framework Java EE i połączone. Obowiązkiem EE framework jest zapewnienie instancji dla konsumenta.

@Stateless

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

Producent samochodów jest przypisany do określonego zakresu Ejbs, dlatego jest Ejb

CDI:

  1. nie zarządzane w całości przez EE framework, instancje muszą być tworzone samodzielnie.
  2. To jest zawsze zależne. pozwól, że wyjaśnię "zależny"za pomocą przykładu:

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

Klasa Specification jest CDI, ponieważ nie jest przypisana do zakresów Ejb, a także musi być zainicjowana przez Twój kod, a nie framework EE. Należy zauważyć, że ponieważ nie dodaliśmy adnotacji do klasy Specification, domyślnie jest ona przypisywana przez @Dependent adnotacja.

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

Further reading: musisz przestudiować więcej między adnotacją zakresu Ejbs a adnotacją zakresu CDI, co dodatkowo wyczyści conceptl

 -1
Author: HA S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-09 01:28:39