java-ee ejb jndi conventions lookup

java ee - ¿Cuál es la relación entre java: comp/env y java: global?



java-ee ejb (1)

¿Cuál es la relación entre java:comp/env y java:global (con respecto a 3.1 especificaciones)?
Parece que java:comp/env contiene referencias a EJB específicas. ¿Qué significa "específico" en este caso?


java:global es un espacio de nombres global para todo el servidor de aplicaciones, que incluye otros módulos EAR (que se consideran aplicaciones diferentes).

java:comp/env es un espacio de nombre mucho más pequeño. Para el módulo web, corresponde a todos los componentes web (servlets, etc.) que se consideran conjuntamente como un único "componente" para JNDI, pero para los beans EJB es un espacio de nombres para un solo bean, ya que cada bean se considera un componente separado.

También hay un java:module java:app y java:module cuyos ámbitos se encuentran entre global y comp.

Una gran diferencia entre java:comp/env y los demás es que el primero es estrictamente de solo lectura en tiempo de ejecución y contiene, entre otros, los beans que se inyectan en algún componente. Por ejemplo, considere:

@Stateless public class ExampleBean { @EJB OtherBean testBean; }

En este caso, el proxy específico que se inyectó en el campo testBean también se puede obtener de java:comp/env , pero solo cuando se hace referencia a java:comp/env desde ExampleBean (JNDI es altamente contextual).

Sin embargo, si deseaba un proxy diferente al EJB OtherBean , o deseaba una referencia cuando no se había realizado ninguna inyección, puede obtenerlos de cualquiera de los otros ámbitos. Dependiendo de la clase desde la que realice la llamada JNDI, podrá usar ámbitos más pequeños.

Por ejemplo, si OtherBean se define en el mismo módulo que ExampleBean , puede usar java:module , si es la misma aplicación (pero posiblemente diferentes módulos) puede usar java:app .

Finalmente, java:global siempre es seguro de usar, ya que no depende del contexto. Esto significa que puede usar desde, por ejemplo, un hilo no administrado completamente separado. La desventaja de usar java:global es que debe incluir el nombre de la aplicación y el nombre del módulo si se usa un EAR, y al menos el nombre del módulo.