java:comp/env
和java:global
(关于3.1规范)之间的关系是什么?
似乎java:comp/env
包含特定于EJB的引用。
在这种情况下,“特定”是什么意思?
java:comp/env
和java:global
(关于3.1规范)之间的关系是什么?
似乎java:comp/env
包含特定于EJB的引用。
在这种情况下,“特定”是什么意思?
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高度上下文相关)。OtherBean
的代理或在未进行注入时需要引用,可以从其他任何作用域中获取。根据您执行 JNDI 调用的类,您将能够使用更小的作用域。OtherBean
定义在与 ExampleBean
相同的模块中,则可以使用 java:module
,如果它是相同的应用程序(但可能是不同的模块),则可以使用 java:app
。java:global
总是安全使用的,因为它不依赖于上下文。这意味着您可以在非托管的完全独立线程中使用。使用 java:global
的缺点是,如果使用 EAR,则必须包括应用程序名称和模块名称,否则至少要包括模块名称。