[英]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);
}
}
}
关于上述示例,我有以下疑问:
在上面的示例中,我们主要使用javax.naming.*
东西; 谁实施它们?
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,特别是您指定的工厂类及其朋友。
- SPI在哪里参与其中?
工厂班级和朋友实施SPI。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.