`
JackyCheng2007
  • 浏览: 255842 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Tomcat 7 源码分析 - 启动概览 bootstrap

阅读更多
先大致浏览一下整个启动过程吧。下面是org.apache.catalina.startup.Bootstrap的main函数。
我在eclipse调用的是start的命令,也就是传入main的参数是start
// 初始化, 构建org.apache.catalina.startup.Catalina实例,并赋值给catalinaDaemon
bootstrap.init();
// 把刚刚创建并初始化好的bootstrap赋值给bootstrap daemon object used by main.
daemon = bootstrap;
// 设置catalinaDaemon的await为true
daemon.setAwait(true);
// 将main的参数传递给org.apache.catalina.startup.Catalina实例:catalinaDaemon,调用catalinaDaemon的load方法
daemon.load(args);
// 调用catalinaDaemon的start来启动tomcat
daemon.start();

可见,Bootstrap只是一个接待员,真正管事的是org.apache.catalina.startup.Catalina实例:catalinaDaemon。下面再细看上面的几步:
1. bootstrap.init()
// Set Catalina path
setCatalinaHome();
setCatalinaBase();
// 初始化class loader
initClassLoaders();
// 初始化3个class loader,commonLoader是parent,catalinaLoader和sharedLoader是child
commonLoader = createClassLoader("common", null);
    if( commonLoader == null ) {
        // no config file, default to this loader - we might be in a 'single' env.
        commonLoader=this.getClass().getClassLoader();
    }
    catalinaLoader = createClassLoader("server", commonLoader);
    sharedLoader = createClassLoader("shared", commonLoader);

// 为当前的线程设置class loader为catalinaLoader
Thread.currentThread().setContextClassLoader(catalinaLoader);
// 用catalinaLoader来加载Catalina类,并创建一个实例
Class<?> startupClass = catalinaLoader.loadClass ("org.apache.catalina.startup.Catalina");
Object startupInstance = startupClass.newInstance();
// 将sharedLoader设置为startupInstance的父loader,利用反射,如同执行了下面这么一句:
startupInstance.setParentClassLoader(sharedLoader)
// 因为Catalina有这么一个方法。
	/**
     * Set the shared extensions class loader.
     *
     * @param parentClassLoader The shared extensions class loader.
     */
    public void setParentClassLoader(ClassLoader parentClassLoader) {
        this.parentClassLoader = parentClassLoader;
    }


// 将建好的startupInstance赋值给catalinaDaemon
catalinaDaemon = startupInstance;
因此,初始话的过程,主要就是设置了Catalina path,初始化了三个class loader,并设置了他们的关系,
构建一个最终是为了org.apache.catalina.startup.Catalina的实例,并赋值给catalinaDaemon。以被后面调用。

2. daemon.load(args)也即catalinaDaemon.load, 创建并初始化一个新的服务器实例
// 初始化目录,命名
initDirs();
initNaming();
// 创建并执行server.xml解析器
Digester digester = createStartDigester();
// 将catalinaDaemon注入server组件(org.apache.catalina.core.StandardServer实例)
getServer().setCatalina(this);
// 重定向System输出流out和错误流err
initStreams();
// 启动这个新server组件
getServer().init();
// 输出服务器初始化时间,也即启动时间,因为后面在Bootstrap最后一步就直接调用start命令了。
3. daemon.start(); 也即是catalinaDaemon.start()
// 启动上面初始化好的server
getServer().start();
// 注册关闭钩子,这样你才能调用shutdown命令停止server
Runtime.getRuntime().addShutdownHook(shutdownHook);
// 等待关闭命令,监听关闭命令的port是8005
if (await) {
    await();
    stop();
}


大致的启动过程也就是这样了,还算比较清楚。接下来抽空看看getServer().init();
分享到:
评论

相关推荐

    Tomcat源码研究.pdf

    ### Tomcat源码研究知识点概览 #### 1.1 Catalina.bat脚本解析 - **脚本功能**:`catalina.bat`是Tomcat启动过程中的关键脚本之一,其主要作用在于构建合适的Java命令行参数,进而启动Tomcat服务。此脚本根据环境...

    tomcatsrc:tomcat源码分析

    本文将通过对"tomcatsrc:tomcat源码分析"这一主题的探讨,帮助读者深入理解Tomcat的核心机制,提升在系统开源领域的专业素养。 一、Tomcat架构概览 Tomcat的架构分为几个主要部分,包括Catalina(核心引擎)、 ...

    基于springboot的实习管理系统源码数据库.doc

    ### 基于SpringBoot的实习管理系统源码数据库知识点概览 #### 一、系统概述与背景 随着信息化管理行业的迅速发展,计算机及互联网技术在日常生活中扮演着越来越重要的角色。实习管理系统作为其中的一种应用,旨在...

    一个完整的网上书店源码,jsp+servlet

    以上是基于“网上书店+jsp+servlet”的项目概览,实际的源码会包含更多细节,如具体的数据库查询语句、业务逻辑代码、JSP页面结构等。通过学习和分析这样的项目,开发者可以提升Web开发技能,更好地理解Web应用的...

    基于SSM的校园二手交易平台系统源码.zip

    SSM(Spring、SpringMVC、MyBatis)是一个经典的Java web开发框架组合,常用于构建企业级应用。本项目“基于SSM的校园二手交易平台系统”是一个实用的实例,...在实际操作中,还需结合源码详细分析各个组件的实现细节。

    基于JSP的计算机学院科研管理系统的实现

    "这部分内容表明,这是一个完整的毕业设计项目,包含了从项目启动到完成的所有关键文档。开题报告通常会详细阐述研究背景、目标、技术选型以及预期成果,为整个项目提供了基础。文献综述则分析了相关的研究成果,...

Global site tag (gtag.js) - Google Analytics