java:comp/env和java:global之间有什么关系?

Yam*_*1sp 22 lookup ejb jndi conventions java-ee

java:comp/envjava:global(关于3.1规范)之间的关系是什么?
似乎java:comp/env包含特定于EJB引用的包含.在这种情况下,"具体"是什么意思?

Arj*_*jms 41

java:global 是整个应用程序服务器的全局命名空间,其中包括其他EAR模块(被认为是不同的应用程序).

java:comp/env小的命名空间.对于Web模块,它对应于所有Web组件(servlet等),它们一起被认为是JNDI的单个"组件",但对于EJB bean,它是单个bean的命名空间,因为每个bean都被认为是单独的组件.

还有a java:app和a java:module,其范围介于global和comp之间.

它们之间的一个很大区别java:comp/env是前者在运行时是严格只读的,并且包含注入某个组件的bean.所以例如考虑:

@Stateless 
public class ExampleBean {

    @EJB
    OtherBean testBean;

}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,注入到字段中的特定代理testBean也可以从中获取java:comp/env,但仅在java:comp/env从ExampleBean中引用时(JNDI是高度上下文的).

但是,如果您想要一个不同的EJB代理OtherBean,或者在没有注入时想要一个引用,那么您可以从任何其他范围获取这些代理.根据您正在进行JNDI调用的类,您可以使用较小的范围.

例如,如果OtherBean在同一模块中定义,则ExampleBean可以使用java:module,如果它是相同的应用程序(但可能是不同的模块),则可以使用java:app.

最后,java:global使用总是安全的,因为它不依赖于上下文.这意味着您可以在例如非托管的完全独立的线程中使用.使用的缺点java:global是,如果使用EAR,则必须包含应用程序名称和模块名称,否则至少包含模块名称.