Tomcat如何注入JNDI组件本地上下文?

时间:2013-07-10 14:25:06

标签: java tomcat jndi

在Tomcat中,您可以在context.xml中指定资源(JDBC连接,Javax邮件会话等),在web.xml中引用它们,然后在Java中加载它们,如下所示:

Context ctx = new InitialContext();
DataSource dataSource = (DataSource)ctx.lookup("java:/comp/env/jdbc/myDB");

我对这里发生的神奇voo doo感兴趣!我原本期望需要使用哈希表或其他对象注入InitialContext构造函数,从而将其注入context.xml和web.xml中定义的所有内容。但它是一个没有参数的构造函数!!!

所以我问:Tomcat做了什么来填补"缺失的链接"两个XML文件和InitialContext无参数构造函数之间,以便DataSource实例可以神奇地提供ctx?提前谢谢!

3 个答案:

答案 0 :(得分:10)

你所描述的魔法伏都教有几个部分。

首先,Tomcat在启动过程的早期调用:

System.setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY,
        "org.apache.naming.java.javaURLContextFactory");

这告诉JVM使用Tomcat自己的工厂来创建InitialContext的实例。

第二部分基于这样一个事实:每个Web应用程序都有自己的类加载器,并且所有用户代码都使用该类加载器集作为线程上下文类加载器执行。因此,当创建新的InitialContext时,Tomcat可以查看线程上下文类加载器以确定发出请求的Web应用程序。

从那里可以很简单地将新的InitialContext对象连接到当前应用程序的正确JNDI资源集。

答案 1 :(得分:6)

在启动时,tomcat读取context.xml并创建在那里定义的所有资源,并使用它的JNDI上下文注册它们。您发布的代码只是获取这些资源的方式。

web.xml(在部署Web应用程序时读取)中,定义的资源不是全新的。这些是Web应用程序的本地,但将指向context.xml中定义的资源。这样做的目的是使您的Web应用程序中的Java代码间接查找服务器资源。

答案 2 :(得分:4)

根据Tomcat documentation

  

InitialContext最初配置为Web应用程序   已部署,并可供Web应用程序组件使用(for   只读访问权限。

如果我不得不猜测,他们只是阅读配置文件的静态位置($CATALINA_BASE/conf/server.xml等),并在部署时为每个Web应用程序提供它。该文档还详细介绍了每个文件的每种条目类型以及每种文件的处理方式。

查看IntialContext.java关于HashTable的预感的源代码是正确的,它确实有一个构造函数,并且似乎将条目存储在HashTable,myProps中。