java:comp/env
和java:global
之间的关系(关于3.1规范)是什么?
似乎java:comp/env
包含特定于EJB引用的内容。
在这种情况下,“具体”是什么意思?
答案 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调用的类,您可以使用较小的范围。
例如,如果OtherBean
与ExampleBean
在同一模块中定义,则可以使用java:module
,如果它是相同的应用程序(但可能是不同的模块),则可以使用java:app
java:global
1}}。
最后,java:global
始终可以安全使用,因为它不依赖于上下文。这意味着您可以在例如一个非托管完全独立的线程。使用{{1}}的缺点是,如果使用EAR,则必须包含应用程序名称和模块名称,否则至少包含模块名称。