在Tomcat中,您可以在context.xml中指定资源(JDBC连接,Javax邮件 session 等),在web.xml中引用它们,然后像下面这样在Java中加载它们:
Context ctx = new InitialContext();
DataSource dataSource = (DataSource)ctx.lookup("java:/comp/env/jdbc/myDB");
我对这里发生了什么神奇的voo doo感兴趣!我本来希望有必要使用哈希表或其他对象来注入(inject)
InitialContext
构造函数,从而将其在context.xml和web.xml中定义的所有内容注入(inject)其中。但这是一个无参数的构造函数!!!因此,我想问:Tomcat做什么来填充2个XML文件和
InitialContext
no-arg构造函数之间的“缺失链接”,以便可以从DataSource
实例神奇地获得ctx
?提前致谢! 最佳答案
正如您所描述的,魔法伏都教有几个部分。
首先,在启动过程中,Tomcat调用:
System.setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY,
"org.apache.naming.java.javaURLContextFactory");
这告诉JVM使用Tomcat自己的工厂来创建InitialContext实例。
第二部分基于以下事实:每个Web应用程序都有其自己的类加载器,并且所有用户代码都以该类加载器设置为线程上下文类加载器来执行。因此,在创建新的InitialContext时,Tomcat可以查看线程上下文类加载器以确定哪个Web应用程序正在发出请求。
从那里开始,使用新的InitialContext对象连接当前应用程序的正确JNDI资源集是一个简单的过程。