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

时间:2011-09-17 22:00:14

标签: java-ee ejb jndi conventions lookup

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

1 个答案:

答案 0 :(得分:41)

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

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

还有一个java:app和一个java:module,其范围介于全局和comp之间。

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

@Stateless 
public class ExampleBean {

    @EJB
    OtherBean testBean;

}

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

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

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

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