Ho un'applicazione che è inclusa in un EAR contenente molti JAR (con EJB, librerie, librerie di terze parti, ...) e una singola GUERRA (di nuovo contenente qualche altro JAR). L'applicazione è distribuita in un contenitore JEE7 (Wildfly 8.0.0.Final) e utilizzando CDI (Weld 2.1.2.Final fornito con Wildfly).Informazioni su CDI/Weld nell'applicazione a più moduli
A mio parere, Weld è attivo in tutta l'applicazione e ha un'unica vista a livello di applicazione. Quindi non importa dove voglio usare CDI - funziona.
Ma ci sono alcune indicazioni che portano a supporre che questo non è vero. Per esempio. la toString
-method del BeanManager
mostra output diverso in diversi moduli:
Quando si utilizza il BeanManager
in qualche modulo che viene confezionato in guerra ottengo 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]
.
Se utilizzato in una libreria direttamente contenuta nell'EAR: Weld BeanManager for test-ear-1.0-SNAPSHOT.ear/test-ejb3-dao-1.0-SNAPSHOT.jar/ [bean count=224]
.
Quindi sembra che questi BeanManagers
siano "responsabili" di diverse parti dell'applicazione. È vero?
Hai ragione. Sembra che il 'for ...' dell'output 'toString' sia il classloader che è attivo nel contesto corrente. Ma questo significa che il server delle applicazioni contiene molte "CDI-applicazioni" (o 'BeanManagers') che gestiscono i loro contesti CDI (come l'ambito applicativo) completamente separatamente? – MrD
No, l'ambito dell'applicazione esiste nell'applicazione, ad esempio l'applicazione EAR. Ma ogni modulo ha il suo BeanManager, mentre il server delle app gestisce le dipendenze tra queste istanze. – thobens
Quindi i diversi bean manager hanno qualche influenza pratica? Se no: perché vale la pena menzionare il modulename/classloader nell'output 'toString'? – MrD