java:comp/env 和 java:global 有啥关系?

Posted

技术标签:

【中文标题】java:comp/env 和 java:global 有啥关系?【英文标题】:What is the relationship between java:comp/env and java:global?java:comp/env 和 java:global 有什么关系? 【发布时间】:2011-11-19 11:06:29 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于java:comp/env 和 java:global 有啥关系?的主要内容,如果未能解决你的问题,请参考以下文章

什么是 java:comp/env? [复制]

在 java:comp/env 中设置属性?

服务器找不到 java:comp/env/jdbc/my_db 数据源...在上下文“java:”中找不到名称 comp/env/jdbc

在 Wildfly 中显示 ENC (java:comp/env/) 下的所有 JNDI 名称

数据源引用 java:/comp/env

不使用 web.xml 时如何将 JDBC 数据源绑定到 JNDI 上下文“java:comp/env/jdbc”