Tomcat6.0源码学习--启动框架
来源:互联网 发布:js获取div name 编辑:程序博客网 时间:2024/04/28 03:22
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,并缓存起来,二.处理命令行参数,根据参数调用不同的操作,此之谓引导。看一下序列图更加清晰:
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实例的装配工厂和引线。- Tomcat6.0源码学习--启动框架
- Tomcat6.0源码学习--启动框架
- Tomcat6.0源码学习
- [Tomcat6.0源码]组件的启动
- Tomcat6源码启动分析
- tomcat6源码学习1.0.0_Catalina类
- Tomcat6.0源码学习--架构概述
- Tomcat6.0源码学习--架构概述
- Tomcat6.0源码学习--Connector架构
- Tomcat6.0源码学习--架构概述
- Tomcat6.0源码学习--Connector架构
- Tomcat6.0源码学习--架构概述
- tomcat6源码研究:tomcat启动
- MyEclipse6.0+Tomcat6.0 启动出错 SSH 框架
- Tomcat6.0源码学习-构建Eclipse源码工程
- tomcat6.0启动不了
- tomcat6.0启动Gzip
- tomcat6.0无法启动
- 总结CString、string、char*
- Tomcat6.0源码学习--接受并传递请求
- 常用路径(待补充)
- SDL源码阅读笔记(2) video dirver的初始化及选择
- 算法杂货铺——分类算法之决策树(Decision tree) - T2噬菌体
- Tomcat6.0源码学习--启动框架
- Break,continue,returne的区别和使用
- 算法复杂度
- 【COCOS2DX-ANDROID-游戏开发之十九】android编译之ctime:66: error: ‘::clock_t’ has not been declared
- 没有文件扩展“.js”的脚本引擎问题解决
- 五险一金用处及投放技巧(工作上的那些事儿)
- solr 使用
- SDL源码阅读笔记(3)渲染模块
- zoj 3736 Pocket Cube(2013亚洲区域赛 长沙站 K)