`
mabusyao
  • 浏览: 254660 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Tomcat 源码学习 之 Bootstrap

阅读更多
类名 Bootstrap
继承关系                          
关联类

Catalina

ClassLoaderFactory

MBeanServer

实现功能

创建Tomcat的classLoader机制

代理Catalina方法调用

初始化全局变量CATALINA_HOME_PROP 和 CATALINA_BASE_PROP

 

 

分析

 

 

Tomcat启动

Tomcat中共有两个类用于Server的启动,Bootstrap和Catalina。作为Bootstrap的主要工作,是代理Catalina内部方法的调用,其本身并不执行任何Server的启动/关闭操作。可以说,Bootstrap和Catalina做了许多重复的工作。初次看代码的读者,都会有这样的困惑:为什么要把Server启动分到两个类里面来做呢?

 

这么做的目的主要有两个:

1. 将Catalina及其相关的类加载脱离System ClassLoader。

2. 支持多种Tomcat启动方式。

 

作为Web Server,Tomcat需要采用和应用程序不同的类加载方式,并确保不同权限的类在内存中有效的隔离。关于Tomcat的类加载机制,我们等下会提到。

 

同时,通过这种分离,可以确保Tomcat支持多种启动方式,包括standalone,多实例以及嵌入式的方式。

 

全局变量

Bootstrap类里包含两个很重要的全局变量:CATALINA_HOME_PROP 和 CATALINA_BASE_PROP。当我们通过正常的启动方式启动Tomcat时,这两个变量所指向的是同一个URL:${TOMCAT_HOME}。

 

那我们为什么需要两个变量来存储同一个值呢?这是因为当我们同时启动多个Tomcat实例(在不同端口上)时,不同实例的CATALINA_BASE_PROP将会指向不同的URL。

 

基本上来说,CATALINA_HOME_PROP指向公用信息的位置,即bin和lib的父目,而 CATALINA_BASE_PROP指向每个Tomcat目录私有信息的位置,即conf、logs、temp、webapps和work的父目录。

 

由于我们运行单个实例时,两者是相同URL,所以变量值也相同。而当我们运行多个Tomcat实例时,两者的不同就显现出来了。

 

类加载机制

Bootstrap类中定义了三个不同的ClassLoader: commonLoader,catalinaLoader 和 sharedLoader。并通过构造这样一个ClassLoader树,以保证模块的类库的私有性:

 

           +---------------------------------------+

           |            Bootstrap              

           |                |                  

           |             System               

           |                |                  

           |             Common                

           |            /         \            

           |        Catalina     Shared        

           |                          /       \        

           |             WebApp1     WebApp2   

           +---------------------------------------+

 

- Bootstrap

- 载入JVM自带的类和$JAVA_HOME/jre/lib/ext/*.jar

- System

- 载入$CLASSPATH/*.class

- Common

- 载入$CATALINA_HOME/common/...,它们对TOMCAT和所有的WEB APP都可见

- Catalina

- 载入$CATALINA_HOME/server/...,它们仅对TOMCAT可见,对所有的WEB APP都不可见

- Shared

- 载入$CATALINA_HOME/shared/...,它们仅对所有WEB APP可见,对TOMCAT不可见

- WebApp

- 载入ContextBase?/WEB-INF/...,它们仅对该WEB APP可见

 

 

最终,Tomcat会将这些类加载器全部用JMX加载并管理。

 

Bootstrap利用ClassLoaderFactory来创建ClassLoader, 这个类里面最主要的接口如下:

 

    public static ClassLoader createClassLoader(File unpacked[], File packed[], final ClassLoader parent)

    public static ClassLoader createClassLoader(List<Repository> repositories, final ClassLoader parent)
 

通过传入URL列表,以及父加载机制,ClassLoaderFactory产生一个StandardClassLoader的实例。StandardClassLoader类继承于URLClassLoader,并实现了一个空的MBean接口StandardClassLoaderMBean,这样就保证了所有的ClassLoader的实例都可以被JMX来维护。

 

StandardClassLoader的代码如下:

 

public class StandardClassLoader
    extends URLClassLoader
    implements StandardClassLoaderMBean {

    public StandardClassLoader(URL repositories[]) {
        super(repositories);
    }

    public StandardClassLoader(URL repositories[], ClassLoader parent) {
        super(repositories, parent);
    }

}


public interface StandardClassLoaderMBean {
    // Marker interface
}

 

将ClassLoader放入JMX的代码:

 

        // Retrieving MBean server
        MBeanServer mBeanServer = null;
        if (MBeanServerFactory.findMBeanServer(null).size() > 0) {
            mBeanServer = MBeanServerFactory.findMBeanServer(null).get(0);
        } else {
            mBeanServer = ManagementFactory.getPlatformMBeanServer();
        }

        // Register the server classloader
        ObjectName objectName =
            new ObjectName("Catalina:type=ServerClassLoader,name=" + name);
        mBeanServer.registerMBean(classLoader, objectName);
 

 

 

Catalina调用

Bootstrap类对于所有Catalina方法的调用都是通过反射机制来实现的。采用这种方式的好处就是,将两者有机的分离开来,为将来的扩展提供便利。


分享到:
评论

相关推荐

    tomcat 源码 学习

    通过阅读相关网络博客,如《(转)Tomcat源码学习(一) - flm_llx的日志 - 网易博客》和《Tomcat源码学习(二) - Carl -- IT博客-中国最具人气的IT博客-赛迪网IT人家园》,你可以获取更多具体细节和实战经验。...

    tomcat源码阅读(一)——环境搭建

    本篇将聚焦于"Tomcat源码阅读(一)——环境搭建",探讨如何搭建一个适合源码学习的开发环境。 首先,我们需要了解Tomcat是什么。Tomcat是一款开源的Java Servlet容器,由Apache软件基金会维护,实现了Java EE中的...

    tomcat7源码下载

    《深入剖析Tomcat7源码》 ...通过对Tomcat7源码的深入学习,开发者不仅可以了解其工作原理,还能针对具体需求进行定制化开发,提高应用的稳定性和效率。下载并研究Tomcat7源码,对于提升Java Web开发技能大有裨益。

    Tomcat源码阅读(一)使用Idea运行Tomcat6源码

    为了深入学习Tomcat源码,可以参考官方文档,以及社区中丰富的教程和博客。同时,通过实践修改源码并观察运行效果,可以更直观地了解Tomcat的工作原理。 总结,通过在Idea中运行Tomcat 6的源码,开发者不仅可以学习...

    tomcat源码

    【Tomcat源码详解】 Tomcat,作为Apache软件基金会的项目之一,是广泛使用的Java Servlet容器,它实现了Java EE的Web应用服务器规范。Tomcat6.0版本是历史上非常流行的一个版本,对于开发者来说,深入理解其源码有...

    springboot+bootstrap博客系统源码

    开发者可以参考源码学习如何整合这两个技术,构建出具有完整功能的博客平台。通过阅读和分析源码,可以深入了解Spring Boot的自动配置、AOP、RESTful API设计,以及Bootstrap的响应式布局和组件使用。这对于提升Web...

    tomcat的源码

    三、学习Tomcat源码的价值 1. **性能优化**:通过分析源码,我们可以了解Tomcat在处理请求时的性能瓶颈,进而进行优化。 2. **故障排查**:理解源码有助于快速定位问题,提高故障排查效率。 3. **定制开发**:...

    apache-tomcat-8.5.78 源码 maven 版本

    apache-tomcat-8.5.78 源码 maven 版本,配置都已经搞定,开箱即用。是学习tomcat的不二之选。启动类 org.apache.catalina.startup.Bootstrap

    tomcat-demo:tomcat源码学习

    【标题】:“Tomcat-Demo:Tomcat源码学习” 【描述】:“对不起,原本这里应该是Tomcat官方的readme,但现在我将用它来记录我的Tomcat源码学习过程。” 【标签】:“系统开源” 在Java Web开发领域,Apache ...

    tomcat7.0源码

    通过深入学习和分析Tomcat 7.0.26的源码,开发者能够更好地理解Web容器的工作原理,优化性能,解决运行时问题,甚至开发自己的Tomcat插件或定制版。这是一项对Java开发者,特别是从事Web服务和中间件开发的工程师...

    apache-tomcat-6.0.18源码

    Tomcat以其轻量级、高效和易用性而闻名,它是Apache软件基金会的项目之一。在这个源码版本中,我们可以深入理解Tomcat的工作原理以及其内部机制。 源码分析: 1. **目录结构**:解压后的源码文件夹通常包含`bin`、`...

    tomcat7.070 源码及转成eclipse

    1. **目录结构**:Tomcat源码主要分为几个核心部分,如`common`、`catalina`、`conf`、`webapps`等。`common`包含所有模块共享的类,`catalina`是核心服务器逻辑,`conf`存储配置文件,`webapps`则是部署应用程序的...

    tomcat6.0源码(eclipse工程)

    使用SVN 在Apache官网checkout下来的tomcat源码,加入了4个依赖jar包,将ant工程改变成了直接可以导入eclipse的Java工程,org.apache.catalina.startup.Bootstrap是启动类,直接运行里边的main方法即可启动,方便...

    Tomcat源码

    《深入剖析Tomcat源码:注释篇》 ...通过对Tomcat源码的深入研究,我们可以学习到Web服务器的设计原则、性能优化策略,以及Java EE相关的技术。这些知识不仅有助于提升开发技能,也对解决实际问题具有指导意义。

    Tomcat6.0.41源代码,可直接导入Eclipse

    五、Tomcat源码学习 通过阅读和分析Tomcat源码,开发者可以: 1. 学习Servlet容器的工作原理,如请求处理流程、session管理等。 2. 理解JSP编译和执行的细节。 3. 掌握Tomcat的部署和上下文配置。 4. 学习线程池、...

    tomcat6源码,学习服务引擎

    《深入解析Tomcat6:源码剖析与服务引擎学习指南》 Tomcat6作为Apache软件基金会的开源项目,是一款广泛使用的Java Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,为Web应用程序提供了运行环境...

    基于springboot和bootstrap搭建的商城系统源码.zip

    综上所述,这个基于SpringBoot和Bootstrap的商城系统源码为学习者提供了深入了解微服务架构和现代前端框架如何协同工作的机会。通过分析和实践这个项目,开发者不仅可以提升SpringBoot的应用能力,还能掌握如何利用...

    tomcat6.0源码,可直接导入eclipse运行

    总之,Apache Tomcat 6.0的源码提供了一个深入学习Web服务技术的平台,特别是对于那些希望掌握Servlet和JSP的开发者。结合Eclipse的强大功能,你可以更高效地探索和调试源码,从而提高你的开发效率和问题解决能力。

    Java源码 SpringMVC Mybatis Shiro Bootstrap Rest Webservice

    项目Maven构建,真实大型互联网...13. Maven项目构建,您可以直接做架构,可以提升自己的学习能力,使您成为真正的架构师。 版本支持: 支持版本: jdk 1.6、1.7、1.8 Web容器: Tomcat 6、7、 8 数据库: mysql

Global site tag (gtag.js) - Google Analytics