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

23

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

1个回答

46

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 总是安全使用的,因为它不依赖于上下文。这意味着您可以在非托管的完全独立线程中使用。使用 java:global 的缺点是,如果使用 EAR,则必须包括应用程序名称和模块名称,否则至少要包括模块名称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接