jetty中的JNDI实现分析
本文主要探讨jetty中的JNDI实现。
?
JNDI的入口类是javax.naming.InitialContext,其中的getURLOrDefaultInitCtx方法用于查找特定提供商的初始上下文对象,代码:
static{try{__javaNameParser = new javaNameParser(); __nameRoot = new NamingContext();__nameRoot.setNameParser(__javaNameParser);StringRefAddr parserAddr = new StringRefAddr("parser", __javaNameParser.getClass().getName()); Reference ref = new Reference ("javax.naming.Context", parserAddr, ContextFactory.class.getName(), (String)null);//bind special object factory at comp__nameRoot.bind ("comp", ref);}catch (Exception e){__log.warn(e);}}
?jetty在__nameRoot中绑定了一个名为comp的Reference类型的变量,这是一个引用。这个变量的工厂类是:org.eclipse.jetty.jndi.ContextFactory,这个类中基于classloader来创建上下文对象。因此在应用程序内部,使用InitialContext的lookup方法查找类似java:comp/env名称的对象时,将基于调用环境返回应用程序相关的上下文,也就是应用程序私有的上下文。
?
从localContextRoot类的名字也可以看出,jetty中的JNDI实现是本机JNDI实现,不支持跨JVM的远程对象查找。
IBM的websphere和Oracle的weblogic等服务器都支持远程对象查找,资源对象可以存放在一个JVM中,并在多个其他的JVM中使用这个资源。开源的JBoss服务器也支持远程对象查找。
我感觉远程JNDI的用处不多,主要查找的都是一些轻量级的服务对象,如:JMSContextProvider。