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/env
和 java: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 调用,您可以使用更小的范围。
例如,如果OtherBean
与ExampleBean
定义在同一个模块中,则可以使用java:module
,如果它是同一个应用程序(但可能是不同的模块),则可以使用java:app
。
最后,java:global
始终可以安全使用,因为它不依赖于上下文。这意味着您可以从内部使用,例如一个非托管的完全独立的线程。使用java:global
的缺点是,如果使用 EAR,则必须包含应用程序名称和模块名称,否则至少包含模块名称。
【讨论】:
以上是关于java:comp/env 和 java:global 有啥关系?的主要内容,如果未能解决你的问题,请参考以下文章
服务器找不到 java:comp/env/jdbc/my_db 数据源...在上下文“java:”中找不到名称 comp/env/jdbc