Tomcat6.0源码学习--启动框架

1.摘要

对于独立运行的应用程序来说,都有一个入口,以便启动应用程序。Java应用程序的入口是类的main方法,在这里你可以初始化应用的上下文环境,然后创建应用组件并提供服务。对于简单的应用程序,可以直接将启动代码放在main方法中,但是,对于复杂的,或者可扩展的应用来说,这样做是不负责任的,也是不优雅的。那么,怎么做才是负责任的,优雅的?下面我们看看Tomcat是如何启动的,分析一下它的启动框架。希望从中能找到答案。

2.Tomcat启动框架

默认的情况下,在命令行下启动Tomcat,程序的入口是org.apache.catalina.startup.Bootstrap类的main方法,Bootstrap是一个final类,不允许扩展。下面看看main方法,

publicstaticvoid main(String args[]) {

        if (daemon == null) {

            daemon = new Bootstrap();

            try {

                daemon.init();

            } catch (Throwable t) {

                t.printStackTrace();

                return;

            }

        }

 

        try {

            String command = "start";

            if (args.length > 0) {

                command = args[args.length - 1];

            }

 

            if (command.equals("startd")) {

                args[0] = "start";

                daemon.load(args);

                daemon.start();

            } elseif (command.equals("stopd")) {

                args[0] = "stop";

                daemon.stop();

            } elseif (command.equals("start")) {

                daemon.setAwait(true);

                daemon.load(args);

                daemon.start();

            } elseif (command.equals("stop")) {

                daemon.stopServer(args);

            } else {

                log.warn("Bootstrap: command \"" + command + "\" does not exist.");

            }

        } catch (Throwable t) {

            t.printStackTrace();

        }

    }


由代码可知,main方法很简单,就做2件事,一.实例化和初始化Bootstrap并缓存起来,二.处理命令行参数,根据参数调用不同的操作,此之谓引导。看一下序列图更加清晰:

Tomcat6.0源码学习--启动框架 - Dinstone - Dinstone 的技术博客

2.1引导过程

       一般来说,在使用一个对象之前,要先初始化好这个对象的状态(就是属性的值),而Bootstrap的初始化也无非干了这些事。

首先初始化属性commonLoader,catalinaLoader,sharedLoader的值,在初始化的过程中先设置了环境变量${catalina.home}和${catalina.base},然后读取配置文件,创建ClassLoader并赋值给属性字段。

接着使用catalinaLoader加载org.apache.catalina.startup.Catalina类并实例化一个对象,并将该对象设置到属性catalinaDaemon中。

当Bootstrap对象初始化完了,就可以接受命令并引导服务了。不同的命令对应不同的Bootstrap动作,而Bootstrap动作委托给Catalina对象来处理。

2.2Catalina

    我们知道,Tomcat是面向组件设计的典范,而且组件的装配是可配置的,那么在Tomcat实例启动之前,必须有一个地方来装配这些个组件。Catalina类正好担此重任。Catalina主要负责Tomcat的装配,并在Bootstrap的引导下操作Tomcat实例。

       当Bootstrap接到“start”命令后,会引导Catalina对象的load动作装配一个新的Server实例,接着Bootstrap引导Catalina对象启动Server实例。由此可以看出,Catalina是Tomcat实例的装配工厂和引线。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值