【问题标题】:JNDI clarification: JNDI API, JNDI SPI, Service ProviderJNDI 说明:JNDI API、JNDI SPI、Service Provider
【发布时间】:2015-06-03 09:36:41
【问题描述】:

我是 JNDI 的新手,我阅读了 oracle 的在线资料:

http://docs.oracle.com/javase/jndi/tutorial/getStarted/overview/index.html

它说 JNDI 有两个 API 即:

1) JNDI API
2) JNDI SPI

此外,它说要使用 JNDI,我们应该有 JNDI 类以及服务提供者。

据我了解,服务提供者是实际的资源(命名或目录),例如LDAP 或 DNS(我的理解是否正确)?

我有以下疑问:

a) JNDI API:我们编写应用程序并使用 JNDI API 进行查找等。现在,谁来实现 JNDI API?它们本身是完整的实现,即由 JDK 提供者自己实现还是由服务提供者实现?

b) JNDI SPI:它到底是什么? JNDI SPI 是否特定于服务,例如LDAP 服务器?谁提供 JNDI SPI 的实现。仅供参考,我看到了 javax.naming.spi 的源代码(以及其他),我看到有一些接口和一些类。这些 JNDI SPI 是否在应用程序端使用(例如,如果我正在编写一个简单的应用程序来从 LDAP 进行查找,那么这个 jar 是否会在应用程序中)

非常感谢任何帮助。

编辑:

这是一个简单的 JNDI 程序。

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class JNDIExample {

    public static void main(String s[]) {

         Hashtable env = new Hashtable();
         env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");

// Is "com.sun.jndi.fscontext.RefFSContextFactory" the SPI API?
// What exactly is this?
         Context ctx = new InitialContext(env);
         try {
                // Create the initial context
                Context ctx = new InitialContext(env);

               // Look up an object
               Object obj = ctx.lookup(name);

               // Print it
               System.out.println(name + " is bound to: " + obj);

         } catch (NamingException e) {
              System.err.println("Problem looking up " + name + ": " + e);
         }
    } 
}

关于上面的例子,我有以下疑问:

  1. 在上面这个例子中,我们主要使用javax.naming.*的东西;谁来实现它们?

  2. SPI 在哪里参与?

【问题讨论】:

  • 不要对非代码文本使用代码格式。

标签: java jndi


【解决方案1】:

a) JNDI API:我们编写应用程序并使用 JNDI API 进行查找等。现在,谁来实现 JNDI API?它们本身是完整的实现,即由 JDK 提供者自己实现还是由服务提供者实现?

无论谁注册了ObjectFactory. 在 JRE 应用程序中,这可能不会超出 JRE 本身。在 Servlet 或 J2EE 容器中,它肯定会扩展到包含容器本身、java:comp 资源,也可能包括 Web 应用程序本身。

b) JNDI SPI:它到底是什么?

是服务提供者必须实现的服务提供者接口。

JNDI SPI 是特定于服务的吗? LDAP 服务器?

是的。

谁提供了 JNDI SPI 的实现。

几乎完全是 JRE 本身。

这些 JNDI SPI 是在应用程序端使用的吗

他们可以,至少就ObjectFactory,而言,但它不常见。

(如果我正在编写一个简单的应用程序来从 LDAP 进行查找,那么这个 jar 也会在应用程序中)

没有。

编辑关于您的新问题:

在上面这个例子中,我们主要使用 javax.naming.* 的东西;谁来实现它们?

JRE,特别是您指定的工厂类及其朋友。

  1. SPI 在哪里参与其中?

工厂类和朋友实现 SPI。

【讨论】:

  • 感谢您的信息,我在代码中又添加了一条注释,请您澄清一下。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多