2014-04-02 15 views
7

Mam aplikację, która jest spakowana w pliku EAR zawierającym wiele plików JAR (z EJB, bibliotekami, bibliotekami stron trzecich, ...) i pojedynczą WAR (ponownie zawierającą inne JAR). Aplikacja jest wdrażana w kontenerze JEE7 (Wildfly 8.0.0.Final) i przy użyciu CDI (Weld 2.1.2.Final dostarczany z Wildfly).Opis aplikacji CDI/Weld w aplikacji wielomodułowej

W moim rozumieniu Weld jest aktywny dla całej aplikacji i ma widok z jednej aplikacji. Więc nie ma znaczenia, gdzie chcę korzystać z CDI - działa.

Ale są pewne wskazówki, które prowadzą do założenia, że ​​nie jest to prawdą. Na przykład. toString -method z BeanManager pokazuje różne wyjścia w różnych modułów:

Podczas korzystania z BeanManager w jakiś moduł, który jest pakowany w wojnie dostaję Weld BeanManager for test-ear-1.0-SNAPSHOT.ear/test-webui-frontend-1.0-SNAPSHOT.war/WEB-INF/lib/test-webui-backend-1.0-SNAPSHOT.jar [bean count=76].

Jeśli jest używany w bibliotece bezpośrednio zawartej w EAR: Weld BeanManager for test-ear-1.0-SNAPSHOT.ear/test-ejb3-dao-1.0-SNAPSHOT.jar/ [bean count=224].

Wygląda na to, że te BeanManagers są "odpowiedzialne" za różne części aplikacji. Czy to prawda?

Odpowiedz

4

Jest to obsługiwane przez serwer aplikacji, który rozumie specyfikację EAR.

Z Wikipedii:

Większość serwerów aplikacji klasy obciążenia z wdrożonym pliku EAR jako pojedyncze drzewa classloaders Java, izolowanie aplikacji z innych zastosowań, ale dzielenie klas pomiędzy wdrożonych modułów. W przypadku przykładu wdrożony plik WAR może tworzyć instancje klas zdefiniowanych w pliku JAR, który był również zawarty w pliku EAR zawierającym , ale niekoniecznie w plikach JAR w innych plikach EAR. Jednym z kluczowych powodów takiego zachowania jest umożliwienie całkowitego rozdzielenia między aplikacjami, które używają statycznych singletonów (np. Log4J), które w innym przypadku mogłyby zmylić konfigurację między oddzielnymi aplikacjami . Pozwala to również na instalowanie różnych wersji aplikacji i bibliotek obok siebie.

Każdy moduł ma swój własny BeanManager, a serwer aplikacji zarządza zależnościami między tymi instancjami.

+0

Masz rację. Wygląda na to, że 'dla ...' wyjścia 'toString' jest programem ładującym klasy, który jest aktywny w bieżącym kontekście. Ale czy to oznacza, że ​​serwer aplikacji ma wiele różnych "aplikacji CDI" (lub "BeanManagers"), które obsługują konteksty CDI (takie jak zakres aplikacji) całkowicie oddzielnie? – MrD

+0

Nie, zakres zastosowania istnieje w aplikacji, tj. W aplikacji EAR. Ale każdy moduł ma swój własny BeanManager, a serwer aplikacji zarządza zależnościami między tymi instancjami. – thobens

+0

Czy różni BeanManagers mają jakikolwiek praktyczny wpływ? Jeśli nie: dlaczego warto wspomnieć o nazwie modulename/classloader na wyjściu 'toString'? – MrD

Powiązane problemy