java - JNDI 说明 : JNDI API, JNDI SPI,服务提供商

标签 java jndi

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

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 (以及其他)的源代码,我看到有一些接口(interface)和一些类。这些 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: We write application and use JNDI API's to do lookup etc. Now, who does implement JNDI API? Are they complete implementation in itself i.e implemented by JDK providers themselves or by service providers?

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

b) JNDI SPI: what exactly is it?

它是服务提供商必须实现的服务提供商接口(interface)。

Are JNDI SPI specific to a service e.g. LDAP server?

是的。

Who provides implementations of JNDI SPI.

几乎完全是 JRE 本身。

Are these JNDI SPI's used in the application side

它们可以,至少对于 ObjectFactory, 来说是这样,但这并不常见。

(like If i am writing a simple application to do lookup from LDAP, so would this jar be in application)

没有。

编辑回复您的新问题:

In this above example we are mainly using javax.naming.* stuff; who implements them?

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

  1. Where is the SPI involved in this?

工厂类和 friend 实现了 SPI。

关于java - JNDI 说明 : JNDI API, JNDI SPI,服务提供商,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30616254/

相关文章:

java - 如何通过单击第一个java Windows应用程序(Jframe)中的菜单项启动第二个Jframe

java - 以日期时间格式java添加小时

spring - Liferay 服务构建器 JNDI 查找使用了错误的命名上下文

java - 无法通过 Java VM 选项配置 JNDI 读取和连接超时属性

java - Spring Boot : How to Disable JNDI lookup and use spring. 数据源代替测试?

java - 更改 JTable 中单元格的背景颜色

Java返回语句

java - 使用oracle 11G与jboss的JNDI配置

java - jndi.properties - 如何设置它?

Java 对具有重复元素的集合进行排序。如果重复,按出现顺序排序