2015-06-03 70 views
1

我是新來的JNDI和我由Oracle看了網上的材料:JNDI澄清:JNDI API,JNDI SPI,服務提供商

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

它說JNDI有兩個API的即:

1) JNDI API 
2) JNDI SPI 

此外,它說使用JNDI,我們應該有JNDI類以及服務提供者。據我所知,服務提供商是實際的資源(命名或目錄),例如, LDAP或DNS(這是我的理解是否正確)?

我有如下疑點:

一)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涉及到哪裏?

+0

請勿對不是代碼的文本使用代碼格式。 – EJP

回答

2

一)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涉及到哪裏?

工廠類和朋友實現SPI。

+0

感謝您的信息,我已在代碼中添加了更多評論,請您澄清一下。非常感謝你的幫助。 – CuriousMind

+0

我已經回答了。 – EJP