【发布时间】:2011-11-19 11:06:29
【问题描述】:
java:comp/env 和 java:global 之间是什么关系(关于 3.1 规范)?
似乎 java:comp/env 包含特定于 EJB 引用。
在这种情况下,“特定”是什么意思?
【问题讨论】:
标签: jakarta-ee ejb jndi conventions lookup
java:comp/env 和 java:global 之间是什么关系(关于 3.1 规范)?
似乎 java:comp/env 包含特定于 EJB 引用。
在这种情况下,“特定”是什么意思?
【问题讨论】:
标签: jakarta-ee ejb jndi conventions lookup
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,则必须包含应用程序名称和模块名称,否则至少包含模块名称。
【讨论】: