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.