InitialContext不仅选择默认主机 (localhost) 和默认端口号。此信息由 glassfish 本身明确设置,这是使用 Java Webstart 技术完成的。
您可以自己测试它:假设您的应用程序客户端已部署到 context localhost:8080/YourClient
。当您访问该链接时,Webstart 正在下载并启动一个 JNLP 文件。您可以手动保存文件,而不是让它自动打开(wget localhost:8080/YourClient
例如在 Linux 上)。您将看到 Glassfish 使用许多参数初始化您的客户端应用程序,包括与 JNDI 相关的属性:
<property name="java.naming.factory.initial" value="com.sun.enterprise.naming.SerialInitContextFactory"/>
<property name="java.naming.factory.url.pkgs" value="com.sun.enterprise.naming"/>
<property name="java.naming.factory.state" value="com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl"/>
<property name="appclient.iiop.defaultHost" value="localhost"/>
<property name="appclient.iiop.defaultPort" value="${request.appclient.iiop.defaultPort}"/>
<property name="${appclient.download.host.propertyName}" value="localhost"/>
<property name="${appclient.user.code.is.signed.propertyName}" value="${appclient.user.code.is.signed}"/>
这些属性不仅是为了您的方便而指定的,它们是强制性的。尝试将您的客户端应用程序作为独立应用程序启动(只需在您喜欢的 IDE 中运行主类):在这种情况下,不会设置初始参数。您会注意到,如果没有这些属性,InitialContext 就不能很好地工作。
对您的问题的简短回答:InitialContext 找到 Glassfish 和 EJB,因为您的应用程序是使用特殊参数启动的,这些参数告诉 InitialContext 在哪里查找、如何初始化所需的类等。