在Tomcat中,可以在context.xml中指定资源(JDBC连接、Javax邮件 session 等),在web.xml中引用它们,然后在Java中加载它们,如下所示:
Context ctx = new InitialContext();
DataSource dataSource = (DataSource)ctx.lookup("java:/comp/env/jdbc/myDB");
我对这里发生的神奇巫术很感兴趣!我原以为需要将哈希表或其他一些对象注入(inject) InitialContext
构造函数,从而将其注入(inject) context.xml 和 web.xml 中定义的所有内容。但它是一个无参数构造函数!!!
所以我问:Tomcat 做了什么来填充 2 个 XML 文件和 InitialContext
无参数构造函数之间的“缺失链接”,以便 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 资源 Hook 。
关于java - Tomcat 如何注入(inject) JNDI 组件本地上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17573219/