Ich habe eine Anwendung, die in einem EAR verpackt ist viele JARs (mit EJBs, Bibliotheken, 3rd-Party-Bibliotheken, ...) und eine einzige WAR (wieder enthält einige andere JARs). Die Anwendung wird in einem JEE7-Container (Wildfly 8.0.0.Final) und mit CDI (Weld 2.1.2.Final im Lieferumfang von Wildfly) bereitgestellt.Verständnis CDI/Weld in Multi-Modul-Anwendung
In meinem Verständnis ist Weld applikationsweit aktiv und hat eine einzige anwendungsweite Sicht. Es ist also egal, wo ich CDI benutzen will - es funktioniert.
Aber es gibt einige Hinweise, die zu der Annahme führen, dass dies nicht wahr ist. Z.B. die toString
-Methode der BeanManager
zeigen verschiedene Ausgabe in verschiedenen Modulen:
Wenn die BeanManager
in einiger Modul, das im Krieg verpackt ich 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]
.
Wenn es in einer Bibliothek verwendet wird, die direkt in der EAR enthalten ist: Weld BeanManager for test-ear-1.0-SNAPSHOT.ear/test-ejb3-dao-1.0-SNAPSHOT.jar/ [bean count=224]
. Es scheint, dass diese BeanManagers
"verantwortlich" für verschiedene Teile der Anwendung sind. Ist das wahr?
Sie haben Recht. Es sieht so aus, als wäre das 'for ...' der 'toString'-Ausgabe der Klassenlader, der im aktuellen Kontext aktiv ist. Bedeutet dies aber, dass der Anwendungsserver viele verschiedene "CDI-Anwendungen" (oder "BeanManager") enthält, die ihre CDI-Kontexte (wie den Anwendungsumfang) vollständig getrennt behandeln? – MrD
Nein, der Anwendungsumfang existiert in der Anwendung, d. H. Der EAR-Anwendung. Jedes Modul verfügt jedoch über einen eigenen BeanManager, während der Anwendungsserver Abhängigkeiten zwischen diesen Instanzen verwaltet. – thobens
Haben also die verschiedenen BeanManager einen praktischen Einfluss? Wenn nein: Warum lohnt es sich, den Modulnamen/Klassenlader in der 'toString' Ausgabe zu erwähnen? – MrD