繁体   English   中英

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

[英]JNDI clarification: JNDI API, JNDI SPI, Service Provider

我是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在哪里参与其中?

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,一样远ObjectFactory,但这并不常见。

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

没有。

编辑关于您的新问题:

在上面的示例中,我们主要使用javax.naming。*的东西; 谁实施它们?

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

  1. SPI在哪里参与其中?

工厂班级和朋友实施SPI。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM