Quelle est la relation entre java:comp/env et java:global?

Quelle est la relation entre java:comp/env et java:global (concernant 3.1 spec)?
On dirait que java:comp/env contient spécifique aux références EJB. Que signifie "spécifique" dans ce cas?

22
demandé sur Yamahar1sp 2011-09-18 02:00:13

1 réponses

java:global est un espace de noms global pour l'ensemble du serveur d'applications, qui inclut d'autres modules EAR (considérés comme des applications différentes).

java:comp/env est un beaucoup plus petit espace de noms. Pour le module web, il correspond à tous les composants web (servlets, etc.) qui sont tous considérés comme un seul 'composant' pour JNDI, mais pour les beans EJB, c'est un espace de noms pour un seul bean, puisque chaque bean est considéré comme un bean séparé. composant.

Il y a aussi un java:app et un java:module, dont les étendues se situent entre global et comp.

Une grande différence entre java:comp/env et les autres est que le premier est strictement en lecture seule à l'exécution et contient entre autres les beans qui sont injectés dans un composant. Donc, par exemple, considérons:

@Stateless 
public class ExampleBean {

    @EJB
    OtherBean testBean;

}

Dans ce cas, le proxy qui a été injecté dans le champ testBean peut également être obtenu à partir de java:comp/env, mais seulement lorsque java:comp/env est appelé dans ExampleBean (JNDI est fortement contextuelle).

Si vous vouliez un proxy différent de L'EJB OtherBean, ou une référence quand aucune injection n'a été faite, vous pouvez les obtenir à partir de l'une des autres étendues. Selon la classe à partir de laquelle vous effectuez L'appel JNDI, vous pourrez utiliser des étendues plus petites.

Par exemple, si OtherBean est défini dans le même module que ExampleBean, vous pouvez utiliser java:module, si c'est la même application (mais peut-être différents modules), vous pouvez utiliser java:app.

Enfin, java:global est toujours sûr à utiliser, car il ne dépend pas du contexte. Cela signifie que vous pouvez utiliser à l'intérieur, par exemple, un thread complètement séparé non géré. L'inconvénient d'utiliser java:global est que vous devez inclure le nom de l'application et le nom du module si une EAR est utilisée, et sinon au moins le nom du module.

40
répondu Arjan Tijms 2011-09-18 09:29:17