什么是全局JNDI名称,为什么它在应用服务器之间有所不同?

时间:2014-06-03 15:14:45

标签: ejb ejb-3.0 jndi ejb-2.x

我正在研究书籍EJB in Action中的EJB 3,本书第5章讨论了环境命名上下文(ENC)。它说:

  

如果您知道JNDI引用如何在EJB 2中工作,那么您就熟悉了   环境命名上下文(ENC)。 ENC允许移植性   应用程序,而不必依赖于全局JNDI名称。全球JNDI   资源名称在应用服务器实现之间有所不同   和ENC允许您使用以...开头的JNDI位置   java:comp / env /而不是硬编码实际的全局JNDI名称。 EJB   3基本上假设代码中使用的所有JNDI名称都是本地的   使用java:comp / env /自动引用名称前缀   前缀。

我没有得到全球JNDI名称的含义?为什么在应用服务器之间必须有所不同?

我将问题标记为EJB2和EJB 3,因为引用引用了这两个版本。如果您不这么认为,请随时编辑。

1 个答案:

答案 0 :(得分:1)

全局JNDI名称在默认JNDI上下文中使用名称。例如,在WebSphere Application Server上,远程EJB默认绑定到ejb/<app>/<module>/<bean>#<interface>。如果在应用程序中对此查找字符串进行硬编码,则应用程序将无法移植到其他应用程序服务器(可能使用不同的默认名称方案),或者如果目标应用程序或模块名称更改,则甚至不能移植到相同的WebSphere Application Server。

EE中的解决方案是为您的应用程序声明EJB引用,该引用将位于java:comp/env上下文中,并带有您选择的名称。当部署者在服务器上安装您的应用程序时,他们可以将java:comp/env名称绑定到适合环境的全局JNDI名称。所有EE资源(数据源,String / int / boolean配置值等)实际使用相同的模式,如果使用得当,它是EE平台的优势之一。

我不知道上面的摘录是在没有更多背景的情况下试图说的。也许它指的是EJBContext.lookup方法,它实际上是相对于java:comp/env进行查找的捷径。

最后,我会注意到EJB 3.1为EJB绑定定义了java:global/<app>/<module>/<bean>!<interface>的标准位置。无论如何,在跨应用程序进行查找时使用EJB引用仍然是最佳实践(如果您没有完全控制将包含EJB客户端的应用程序,则甚至跨模块)。