`

Tomcat源码分析之JNDI

阅读更多

在tomcat服务器中,我们可以通过配置文件%CATALINA_HOME%/conf/server.xml来对所用到的资源进行配置,如代码:
Xml代码

Xml代码 复制代码
<GlobalNamingResources>
  <Resource
    name="UserDatabase"
    auth="Container"
    type="org.apache.catalina.UserDatabase"
    description="User database that can be updated and saved"
    factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
    pathname="conf/tomcat-users.xml" />
  <Resource
    name="jdbc/wroxTC6"
    auth="Container"
    type="javax.sql.DataSource"
    maxActive="20"
    maxIdle="30"
    maxWait="10000"
    username="root"
    password="1234"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/test?autoReconnect=true" />
</GlobalNamingResources>
<GlobalNamingResources>
  <Resource
    name="UserDatabase"
    auth="Container"
    type="org.apache.catalina.UserDatabase"
    description="User database that can be updated and saved"
    factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
    pathname="conf/tomcat-users.xml" />
  <Resource
    name="jdbc/wroxTC6"
    auth="Container"
    type="javax.sql.DataSource"
    maxActive="20"
    maxIdle="30"
    maxWait="10000"
    username="root"
    password="1234"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/test?autoReconnect=true" />
</GlobalNamingResources>



在这段配置中,指定了两个资源,一个是UserDatabase,另一个是jdbc/wroxTC6。本文主要讲述了,在tomcat是怎样通过JNDI来找到这些资源的。

1.JNDI基础和Tomcat中的JNDI
JNDI的全称是Java Naming and Directory Interface, JNDI的整体架构包含有JNDI API和JNDI SPI。利用前者可以访问各种Naming Services和Directory Services。

Service Providers利用JNDI SPI来编写这些服务。因此这些服务可以被Java应用灵活的插拔。

在JNDI中,用名字来标识一个服务对象,name和object之间建立的关联称为一个binding,binding的集合称作context。
javax.naming.Context是Naming Services所在的上下文接口;javax.naming.directory.DirContext是Directory Services所在的上下文接口。

在tomcat中类NamingContext实现了接口Context,在该类中保存有多个binding,每一个binding是一个 NamingEntry实例。对于NamingEntry分为4种类型:ENTRY、LINK_REF、REFERENCE和CONTEXT。
在tomcat中的配置文件service.xml中,可以为tomcat服务器配置全局的Naming Resource,也可以单独为某一个web应用配置局部的Naming Resource。

2.寻找被绑定的资源
在tomcat启动时,采用了责任链模式来进行。在启动StandardServer时,调用与之相关的监听器。在监听器NamingContextListener中,对全局的Naming Resources建立Context,绑定资源,查找资源等等。在启动StandardContext时,监听器NamingContextListener负责完成对局部Naming Resources相关操作。本文讲述对全局的Naming Resources的处理。

(1)首先是建立NamingContext类的实例:根Context(名字为:"/")

(2)将资源对象从NamingResources中取出,形成Reference,绑定到根Context中。

因为在加载配置文件时,利用tomcat中的Digester,已经将配置文件形成了类NamingResources的实例,也就是配置文件的信息已经形成了相应的NamingResources对象。从NamingResources实例中取出资源,建立ResourceRef实例。
ResourceRef继承了java.naming.Reference,该类并不是具体的Resource,也不做为binding中的object 加入到Context中。但是通过该对象,可以找到待绑定的Service,例如在UserDatabase所形成的ResourceRef实例中,指定的Reference的className是org.apache.catalina.UserDatabase;而配置文件的factory属性对应于一个StringRefAddr对象,加入到了Reference中。

将该Reference对象,形成REFERENCE类型的NamingEntry对象,并以资源的name属性为名称,加入根Context中。例如:以UserDatabase为名称,将该Resource对应的REFERENCE类型的NamingEntry对象,加入到了根Context中。

(3)从根Context查找资源,利用Reference找到资源。
当利用资源名称查找资源时,调用的是NamingContext.lookup方法。该方法中利用JNDI的方法NamingManager.getObjectInstance来调用Service Provider所提供的Service。
在方法NamingManager.getObjectInstance中,若传递的Reference不为空,则调用Reference的getFactoryClassName来获得具体的factory类(该factory类由Service Provider来实现,所以能够找到具体的资源。在Tomcat中,ResourceRef覆盖了getFactoryClassName方法,得到的是ResourceFactory实例)
调用ResourceFactory.getObjectInstance方法,从Reference的RefAddr中得到org.apache.catalina.users.MemoryUserDatabaseFactory实例,通过MemoryUserDatabaseFactory.getObjectInstance得到具体的资源MemoryUserDatabase对象。
(4)将真实的对象赋给NamingEntry的object属性,更改NamingEntry的类型为ENTRY。
此时根Context中存在有对真实的资源的绑定,名称为该资源的名称。

3.建立子Context
如果资源的名称中包含"/",则将REFERENCE类型的NamingEntry对象加入到Context前,要建立子Context。例如资源"jdbc/wroxTC6",需要建立子Context。

(1)建立子Context
建立子Context,并将该Context以CONTEXT类型的NamingEntry加入到根Context中。

(2)将资源对象从NamingResources中取出,形成Reference,绑定到子Context中。
在调用根Context对象的bind方法时,将资源的绑定委派到子Context中,将Reference绑定到子Context中。例如将资源"wroxTC6"绑定到以"jdbc"为名字的子Context中。

(3)查找资源,绑定真实的资源到子Context中。
在进行资源查找和找真实资源时,原理同2,只不过是首先找到子Context,然后再进行。

分享到:
评论

相关推荐

    Tomcat6配置JNDI出错

    通过仔细分析上述步骤,你应该能够解决Tomcat6配置JNDI时遇到的问题。如果你仍然遇到困难,可以参考提供的博文链接或寻求社区支持。记住,持续学习和实践是解决IT问题的关键。在理解JNDI和Tomcat的工作原理后,你...

    tomcat源码

    Apache Tomcat源码分析 Apache Tomcat是一款广泛应用的开源Java Servlet容器,它是Java EE Web应用程序的标准实现。Tomcat源码的深入理解对于Java Web开发者来说是至关重要的,它可以帮助我们了解HTTP服务器的工作...

    tomcat源码及相关依赖包

    《深入理解Tomcat源码与依赖包》 Tomcat,作为Apache软件基金会的顶级项目,是广泛应用的开源Java Servlet容器,它实现了Java EE中的Servlet和JavaServer Pages(JSP)规范。本文将深入探讨Tomcat的源码以及相关...

    tomcat源码基于6.0

    二、Tomcat源码分析 1. **启动流程**:从`bin/catalina.sh`或`bin/catalina.bat`开始,通过`org.apache.catalina.startup.Bootstrap`启动Catalina,加载配置文件,初始化服务器,最后启动主循环监听端口。 2. **...

    TOMCAT源代码,包括转载得别人的分析

    通过阅读"TOMCAT源码分析.doc"和解压后的"apache-tomcat-6.0.0-src.zip",你可以深入了解上述知识点,并学习如何根据源码进行调试、优化或扩展Tomcat。这份资料对于Java Web开发者来说是一份宝贵的参考资料,有助于...

    tomcat 7 源码分析-4 server初始化背后getServer().init()

    【标题】:“Tomcat 7 源码分析 - 4 server初始化背后getServer().init()” 在这篇文章中,我们将深入探讨Apache Tomcat 7服务器的内部工作机制,重点关注`getServer().init()`方法在服务器初始化过程中的作用。...

    (收集)tomcat jndi

    这两个标签暗示了这篇资料可能涵盖了Tomcat JNDI的源码分析以及可能涉及的工具使用,例如,如何通过查看Tomcat的源代码理解JNDI的工作原理,或者介绍用于管理JNDI资源的实用工具。 【压缩包子文件的文件名称列表】...

    tomcat 6 源码

    通过研究Tomcat源码,开发者可以学习到如何构建一个高性能的Servlet容器,掌握Java Web应用的核心运行机制,这对于提升Java EE开发能力大有裨益。同时,如果你遇到Tomcat的使用问题或者想要进行定制化开发,源码分析...

    学习tomcat源码+英文《How Tomcat Work》和每一章的相关项目+tomcat6源码依赖jar

    在深入探讨Tomcat源码之前,我们先了解一下Tomcat是什么。Tomcat是一款开源的Java Servlet容器,由Apache软件基金会开发,它实现了Java EE中的Web应用服务器部分,特别是Servlet和JavaServer Pages (JSP)规范。《How...

    2020面试说明Tomcat源码手写.rar

    Tomcat源码的实践分析有助于开发者理解Web服务器的工作机制,这对于面试中解答关于性能优化、故障排查以及系统设计的问题至关重要。 【标签】"2020面试 java说明Tomcat源码手写"强调了这个压缩包与Java开发者的面试...

    tomcat 7 及其源码

    4. **源码分析**: - 源码可以帮助开发者深入理解Tomcat的工作原理,比如请求处理流程、会话管理、错误处理等。 - 关注`org.apache.catalina`和`org.apache.coyote`包下的类,了解请求和响应的生命周期。 - 学习`...

    tomcat-4.0.1源码

    在源码分析过程中,有几点是值得特别关注的: - **容器架构**:Tomcat采用容器模型,每个Web应用都有一个独立的Context,每个Context又包含多个Host,每个Host可以包含多个Virtual Server。这种层次化的结构使得...

    tomcat9.0源码

    源码分析: 1. **目录结构**: Tomcat的源码结构清晰,主要包括以下几个关键部分: - `bin`:包含启动和管理Tomcat的脚本。 - `conf`:配置文件存放地,如server.xml,web.xml等。 - `lib`:Tomcat运行所需的...

    apache-tomcat-6.0.18源码

    源码分析: 1. **目录结构**:解压后的源码文件夹通常包含`bin`、`conf`、`lib`、`logs`、`webapps`、`work`等目录。`bin`存放启动和停止服务器的脚本,`conf`存储配置文件,`lib`包含运行Tomcat所需的JAR文件,`...

    tomcat7 源码

    源码分析是理解其工作原理和提升开发技能的重要途径。Apache Tomcat 7.0.33的源码提供了丰富的学习材料,让我们一起探索其中的关键知识点。 1. **架构设计** Tomcat采用模块化设计,主要由Catalina、Jasper、Juli...

    apache-tomcat源码

    在深入理解Apache Tomcat源码之前,我们首先需要对Java Web开发的基础知识有所了解。 1. **Java Servlet**: Servlet是Java编写的应用程序,它运行在服务器端,处理客户端的HTTP请求,并返回响应。Servlet API定义了...

    Tomcat服务器源码

    Tomcat源码主要由以下几个关键组件构成: 1. **Catalina**:这是Tomcat的核心组件,负责处理Servlet容器的主要功能,包括Servlet和JSP的加载、调度和执行。Catalina的核心类是`org.apache.catalina.core....

    tomcat8.0.53源码

    通过阅读和分析Tomcat源码,开发者可以学习到如何实现一个高性能的Web服务器,如何处理并发请求,以及如何遵循Java EE规范来编写可部署的Web应用程序。此外,对于遇到的问题,查看源码往往能帮助找到解决方案,提高...

    tomcat-source:tomcat源码分析

    【标题】:Tomcat源码分析 【描述】:Tomcat是Apache软件基金会下的一个开源项目,是一款广泛使用的Java Servlet容器,它实现了Java EE的Web应用服务器标准。深入理解Tomcat的源码对于提升Java Web开发技能、优化...

Global site tag (gtag.js) - Google Analytics