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