JNDI澄清:JNDI API,JNDI SPI,服务提供商

时间:2015-06-03 09:36:41

标签: java jndi

我是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涉及哪里?

1 个答案:

答案 0 :(得分:2)

  

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

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

  

b)JNDI SPI:究竟是什么?

服务提供商必须实施服务提供商接口。

  

JNDI SPI是否特定于服务,例如LDAP服务器?

  

谁提供JNDI SPI的实现。

几乎完全是JRE本身。

  

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

它们至少可以ObjectFactory,,但它并不常见。

  

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

没有

编辑重新提问:

  

在上面的例子中,我们主要使用javax.naming。* stuff;谁实现了它们?

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

  
      
  1. SPI涉及哪里?
  2.   

工厂类和朋友实施SPI。