Próbowałem się dowiedzieć, czym EJB
są fasole, co to znaczy, że ich instancje są zarządzane w basenie, bla, bla. Naprawdę nie mogę ich dobrze uchwycić.
Czy możesz mi wyjaśnić, czym one naprawdę są (praktycznie dla programisty Java)? Co oni robią? Jakie są ich cele? Po co ich naprawdę używać? (Dlaczego po prostu nie trzymać się POJO
?) Może przykładowa aplikacja?
Proszę odnieść się tylko do zaktualizowanych informacji, to znaczy EJB 3.1
. Nieaktualne informacje o EJB mogą wprowadzać w błąd.
Dla początkujących uczących się EJB uwaga:
EJB są oparte na obiektach rozproszonych , dotyczy to elementów oprogramowania działających na wielu maszynach (wirtualnych lub fizycznych) połączonych siecią .
jakarta-ee
ejb
ejb-3.1
jacktrades
źródło
źródło
Odpowiedzi:
JEŚLI potrzebujesz komponentu, który uzyskuje dostęp do bazy danych lub uzyskuje dostęp do innych zasobów łączności / katalogu, lub jest dostępny z wielu klientów lub jest przeznaczony jako usługa SOA, dzisiejsze EJB są zwykle „większe, silniejsze, szybsze (lub przynajmniej bardziej skalowalne) i prostsze ”niż POJO. Są najbardziej wartościowe w przypadku obsługi dużej liczby użytkowników w sieci WWW lub sieci firmowej, a nieco mniej w przypadku małych aplikacji w ramach działu.
Ponowne użycie / udostępnianie logiki w wielu aplikacjach / klientach z luźnym sprzężeniem.
EJB można pakować do własnych słoików, wdrażać i wywoływać z wielu miejsc. Są to elementy wspólne. To prawda, POJO można (ostrożnie!) Projektować jako biblioteki i pakować jako słoiki. Ale EJB obsługują zarówno lokalny, jak i zdalny dostęp do sieci - w tym za pośrednictwem lokalnego interfejsu Java, przezroczystego RMI, wiadomości asynchronicznej JMS i usługi sieciowej SOAP / REST, oszczędzając przed zależnościami typu „wytnij i wklej” w wielu (niespójnych?) Wdrożeniach.
Są bardzo przydatne do tworzenia usług SOA. W przypadku dostępu lokalnego są to POJO (z dodanymi bezpłatnymi usługami kontenerowymi). Czynność projektowania oddzielnej warstwy EJB promuje szczególną dbałość o maksymalizację enkapsulacji, luźnego sprzężenia i spójności oraz promuje czysty interfejs (Fasada), chroniąc dzwoniących przed złożonymi modelami przetwarzania i danych.
Skalowalność i niezawodność W przypadku zastosowania ogromnej liczby żądań z różnych wywołujących komunikatów / procesów / wątków są one najpierw dystrybuowane do dostępnych instancji EJB w puli, a następnie umieszczane w kolejce. Oznacza to, że jeśli liczba żądań przychodzących na sekundę jest większa niż serwer może obsłużyć, postępujemy z wdziękiem - zawsze niektóre żądania są przetwarzane efektywnie, a nadmiarowe żądania czekają. Nie osiągamy „topnienia” serwera - gdzie WSZYSTKIE żądania jednocześnie doświadczają okropnego czasu odpowiedzi, a serwer próbuje uzyskać dostęp do większej liczby zasobów, niż jest w stanie obsłużyć sprzęt i system operacyjny, co powoduje awarie. EJB można wdrożyć na oddzielnej warstwie, którą można łączyć w klastry - zapewnia to niezawodność dzięki możliwości przełączania awaryjnego z jednego serwera na drugi, a ponadto można dodać sprzęt w celu skalowania liniowego.
Zarządzanie współbieżnością. Kontener zapewnia, że instancje EJB są automatycznie bezpiecznie (szeregowo) dostępne dla wielu klientów. Kontener zarządza pulą EJB, pulą wątków, kolejką wywołań i automatycznie wykonuje blokowanie zapisu na poziomie metody (domyślne) lub blokowanie odczytu (za pośrednictwem @Lock (READ)). Chroni to dane przed uszkodzeniem w wyniku współbieżnych kolizji zapisu i zapisu oraz ułatwia spójne odczytywanie danych, zapobiegając konfliktom odczytu i zapisu.
Jest to przydatne głównie w przypadku komponentów bean sesji @Singleton, w których komponent bean manipuluje i udostępnia wspólny stan między wywołującymi klientami. Można to łatwo ominąć, aby ręcznie skonfigurować lub programowo kontrolować zaawansowane scenariusze dla współbieżnego wykonywania kodu i dostępu do danych.
Zautomatyzowana obsługa transakcji.
Nie rób nic, a wszystkie Twoje metody EJB są uruchamiane w transakcji JTA. Jeśli uzyskujesz dostęp do bazy danych za pomocą JPA lub JDBC, jest ona automatycznie rejestrowana w transakcji. To samo dotyczy wywołań JMS i JCA. Podaj @TransactionAttribute (someTransactionMode) przed metodą, aby określić, czy / w jaki sposób ta konkretna metoda uczestniczy w transakcji JTA, nadpisując tryb domyślny: „Wymagane”.
Bardzo prosty dostęp do zasobów / zależności poprzez wstrzyknięcie.
Kontener wyszuka zasoby i ustawi odniesienia do zasobów jako pola instancji w EJB: takie jak zapisane połączenia JDBC JNDI, połączenia / tematy / kolejki JMS, inne EJB, transakcje JTA, konteksty trwałości menedżera encji JPA, jednostki trwałości fabryki menedżera encji JPA oraz Zasoby adaptera JCA. np. aby ustawić odniesienie do innego EJB i transakcji JTA oraz menedżera encji JPA i fabryki połączeń JMS i kolejki:
Serwlet może wywołać ten bean lokalnie, po prostu deklarując zmienną instancji:
a następnie po prostu wywołując jego metody zgodnie z potrzebami.
Inteligentna interakcja z WZP. Domyślnie EntityManager wstrzyknięty jak powyżej używa kontekstu trwałości o zasięgu transakcji. Jest to idealne rozwiązanie dla fasoli sesji bezstanowych. Gdy wywoływana jest (bezstanowa) metoda EJB, w ramach nowej transakcji tworzony jest nowy kontekst trwałości, wszystkie instancje obiektu jednostki pobrane / zapisane w bazie danych są widoczne tylko w ramach tego wywołania metody i są odizolowane od innych metod. Ale jeśli inne bezstanowe EJB są wywoływane tą metodą, kontener propaguje się i udostępnia im ten sam komputer, więc te same jednostki są automatycznie udostępniane w spójny sposób przez komputer w tej samej transakcji.
Jeśli zadeklarowano komponent bean sesji @Stateful, równe inteligentne podobieństwo z JPA jest osiągane przez zadeklarowanie elementu entityManager jako elementu o rozszerzonym zakresie: @PersistentContent (unitName = "AccountsPU, type = EXTENDED). To istnieje przez cały czas trwania sesji fasoli, w wielu wywołaniach i transakcjach bean, buforowanie w pamięci kopii jednostek bazy danych, które zostały wcześniej pobrane / zapisane, aby nie trzeba było ich ponownie odzyskiwać.
Zarządzanie cyklem życia. Cykl życia EJB jest zarządzany przez kontener. W razie potrzeby tworzy instancje EJB, czyści i inicjuje stan komponentu bean sesji, pasywuje i aktywuje oraz wywołuje metody wywołania zwrotnego cyklu życia, dzięki czemu kod EJB może uczestniczyć w operacjach cyklu życia w celu pozyskiwania i zwalniania zasobów lub wykonywania innych czynności inicjowania i zamykania. Przechwytuje również wszystkie wyjątki, rejestruje je, wycofuje transakcje zgodnie z wymaganiami i w razie potrzeby zgłasza nowe wyjątki EJB lub @ApplicationExceptions.
Zarządzanie bezpieczeństwem. Oparta na rolach kontrola dostępu do EJB może zostać skonfigurowana za pomocą prostej adnotacji lub ustawienia XML. Serwer automatycznie przekazuje szczegóły uwierzytelnionego użytkownika wraz z każdym wywołaniem jako kontekst zabezpieczeń (nazwa główna i rola wywołującego). Zapewnia to, że wszystkie reguły RBAC są automatycznie egzekwowane, aby metody nie mogły być nielegalnie wywoływane przez niewłaściwą rolę. Umożliwia EJB łatwy dostęp do szczegółów użytkownika / roli w celu dodatkowego automatycznego sprawdzania. Umożliwia podłączenie dodatkowego przetwarzania bezpieczeństwa (lub nawet narzędzi IAM) do kontenera w standardowy sposób.
Standaryzacja i przenośność. Implementacje EJB są zgodne ze standardami Java EE i konwencjami kodowania, co zapewnia jakość oraz łatwość zrozumienia i utrzymania. Promuje również przenośność kodu na serwery aplikacji nowych dostawców, zapewniając, że wszystkie obsługują te same standardowe funkcje i zachowania, a także zniechęcając programistów do przypadkowego przyjmowania zastrzeżonych,
nieprzenośnych funkcji dostawców.
The Real Kicker: Prostota. Wszystko to można zrobić za pomocą bardzo uproszczonego kodu - albo przy użyciu domyślnych ustawień EJB w Java EE 6, albo dodając kilka adnotacji. Kodowanie cech korporacyjnych / przemysłowych we własnych POJO byłoby znacznie bardziej obszerne, złożone i podatne na błędy. Gdy zaczniesz programować za pomocą EJB, są one raczej łatwe do opracowania i dają wspaniały zestaw korzyści związanych z „darmową jazdą”.
W oryginalnej specyfikacji EJB sprzed 10 lat EJB stanowiły poważny problem z produktywnością. Były rozdęte, wymagały mnóstwa kodu i artefaktów konfiguracyjnych oraz zapewniały około 2/3 powyższych korzyści. Większość projektów internetowych w rzeczywistości ich nie wykorzystywała. Ale to się znacznie zmieniło po 10 latach ulepszania, przeglądów, ulepszania funkcjonalnego i usprawniania rozwoju. W Java EE 6 zapewniają maksymalny poziom wytrzymałości przemysłowej i prostotę użytkowania.
Czego nie lubić ?? :-) :-)
źródło
EJB to komponent Java, zawierający logikę biznesową, który wdrażasz w kontenerze i który korzysta z usług technicznych świadczonych przez kontener, zwykle w sposób deklaratywny, dzięki adnotacjom:
źródło
Mam nadzieję, że to z dokumentu Oracle pomoże komuś takiemu jak ja zrozumieć temat EJB w prosty sposób.
źródło
Najbardziej interesuje mnie pytanie, jak i gdzie mogę ich używać. Aby to zrozumieć, musimy najpierw sprawdzić, jakie typy EJB istnieją. Istnieją 2 duże kategorie:
Rozważmy fasolki sesji. Są 3 rodzaje:
OrderService
. Innym dużym zastosowaniem tych usług jest udostępnianie usług internetowych. Ponownie, jest to warstwa usług lub całkowicie oddzielna.Configuration
przychodzi na myśl komponent - w którym możesz przechowywać konfiguracje na poziomie aplikacji i uzyskiwać do nich dostęp, gdy ich potrzebujesz z dowolnego miejsca.Teraz pozostałych możliwości lub funkcji można używać na różnych warstwach w takich sytuacjach:
Jednym z dużych zastosowań w dzisiejszych czasach są tak zwane mikrousługi i architektury zorientowane na usługi. Możesz spakować niektóre komponenty logiki biznesowej jako EJB i rozprowadzić je w całej organizacji, aby mogły być używane przez wielu klientów (przez klienta mam tutaj na myśli inne aplikacje zaplecza).
I tak dalej. Teraz wielką wadą jest to, że stajesz się bardzo zależny od kontenera EJB i chociaż możesz przełączać się między 2 implementacjami referencyjnymi, nie będziesz w stanie przełączyć się na coś lżejszego - na przykład Tomcat. Ale dlaczego miałbyś chcieć poświęcić wszystkie korzyści?
źródło