java - Tomcat 如何注入(inject) JNDI 组件本地上下文?

标签 java tomcat jndi

在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/

相关文章:

tomcat - 如何在 Ubuntu 14 上使用 SSL 配置 tomcat 7 - Unresolved 问题

java - IntelliJ 在打开 Gradle 项目时崩溃,为什么?

JAVA - 使用 JNDI 或 Spring LDAP 从 AD 获取最大密码期限 (maxPwdAge)?

java - 带有 Windows AD 的 Tomcat 6 领域配置

java - 如何在 weblogic.xml 中创建自定义 ManagedScheduledExecutorService 并在 java 代码中使用它?

java - 避免对 Spring 配置类进行类路径扫描

java - 如何用Java制作一个Android倒计时器?

tomcat - Javafx-Rich-Client-Applications 持续集成的最佳方式是什么

java - 在 java JFace 对话框中禁用关闭按钮?

java - 如何让 Tomcat 等到 Web 应用程序完成?