我正在研究书籍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,因为引用引用了这两个版本。如果您不这么认为,请随时编辑。
答案 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客户端的应用程序,则甚至跨模块)。