使用JNDI时不是需要设定一个叫Context.INITIAL_CONTEXT_FACTORY的参数吗。而这个参数正好上jndi的实现入口。在j2ee规范中有很多地方使用的抽象工厂来得到具体的实现如:jndi,jdbc,jaxp等等。而抽象工厂需要一个得到“一组”实现的一个入口,而在jndi中,你设定INITIAL_CONTEXT_FACTORY的值就是这个入口类的全名,其必须实现InitialContextFactory接口,该接口有个方法Context getInitialContext(Hashtable<?,?> environment),jndi实现必须实现该方法以得到其上下文的“根”,而Context则代表的是“树”上的一个“节点”。现在回到你的问题"它是如何知道要在这些XML中取出数据",那么既然tomcat要引入jndi,则必须按照jndi规范实现jndi,所以tomcat按照自己的规则读取了你上面所说的xxx.xml里面的数据,存储在内存中,并且可以通过tomcat提供的途径访问这些数据,那么怎么访问这些数据呢,使用tomcat按照jnci规范实现的类,于是你便可以使用标准的jndi接口访问这些数据呢,那么怎样才能得到tomcat的实现呢,就是通过设定INITIAL_CONTEXT_FACTORY参数,将INITIAL_CONTEXT_FACTORY参数设定为tomcat的实现类,那么通过jndi标准接口得到的就是tomcat的实现了,既然使用的是tomcat的实现,那么他自己当然知道怎么访问其自己先前在内存中存储的资源了。大概流程是这样子的,当然可能有些细节不是很准确或有误(有些也是猜的:)),但是应该不影响理解。

解决方案 »

  1.   

    还有你的“我可以自己设置JNDI指向的XXXX.XML的内容吗”这个问题,正如上面所说,从哪个文件读取数据是tomcat实现jndi规范时自己处理的,你要想改变这个文件名,除非是tomcat实现jndi接口时提供了这个功能,反正jndi规范是不提供的
      

  2.   

    可以参考http://java.sun.com/products/jndi/tutorial/TOC.html
      

  3.   

    也就是说具体的实现还是用指定的工厂类的接口,而若我们要实际制定一种JNDI服务,或者说读取我们自己规定的xxxx.XML,必须自己建立一个特别的工厂类.谢谢了:)