1.Tomcat源码分析— Bootstrap启动流程
2.å¦ä½ä½¿ç¨Bootstrap
Tomcat源码分析— Bootstrap启动流程
在探讨Tomcat启动流程之前,码解需要理解其组件及其周期状态,码解这为后续深入学习组件初始化与启动等提供了基础。码解
实现Lifecycle接口的码解组件拥有种状态。Bootstrap作为Tomcat启动入口类,码解负责构造类加载器以加载Catalina内部类,码解dim愿望清单源码通过查找catalina.home目录下所有jar包,码解确保安全地加载应用程序类。码解
通过Bootstrap的码解main方法启动Tomcat实例,主要步骤包括创建Bootstrap对象、码解调用init方法,码解并根据启动参数执行load和start方法。码解
Bootstrap的码解init方法初始化类加载器,使得Tomcat能加载应用程序类,码解同时设置当前线程上下文加载器为CatalinaLoader。码解智慧综合水务源码initClassLoaders方法创建三种类加载器,其中catalinaLoader与sharedLoader的父加载器为commonLoader。完成初始化后,预加载tomcat和javax包下的自定义类,避免访问权限异常。
调用catalinaLoader加载器加载Catalina类,通过反射实例化对象,cf秒死源码并设置sharedLoader实例作为入参,最后将实例化的Catalina对象赋予catalinaDaemon成员变量。
Tomcat组件的初始化主要在load方法中完成,通过反射调用Catalina的load方法,构建并初始化StandardServer及其子组件。Bootstrap.load方法通过反射调用Catalina的load方法,Catalina的飞行者定位源码load方法实现序列图中的逻辑,初始化配置文件解析器Digester,构建standardServer实例,绑定当前catalina实例,设置根路径,并调用init方法完成初始化。
Tomcat中的容器或组件使用模板方法设计模式,子类通过重写LifecycleBase抽象类的电波源码公式模板方法initInternal实现初始化逻辑。LifecycleBase的init方法主要完成两件事:调用父类的LifecycleBase#init方法,由standerServer#initInternal方法执行实际初始化。init方法逻辑包括:执行LifecycleBase#initInternal抽象方法,由standardServer#initInternal方法完成初始化。
service组件的init方法主要初始化Connector连接器,连接器的初始化尤为重要。不同协议处理器如AjpAprProtocol、HttpNioProtocol的初始化流程将在后续文章中单独讲解。
Bootstrap类的main方法通过反射执行catalina实例的start方法,启动standardServer实例,使其监听端口并接收新请求。start方法主要逻辑包括启动Service、Engine容器、Executor执行器、MapperListener监听器、Connector连接器等组件。当启动成功后,创建并监听端口,Tomcat对外提供服务。
总结,Tomcat的启动流程清晰且依赖模板方法与责任链设计模式,理解这两种模式有助于更好地理解启动过程及代码。启动过程首先初始化各组件,如Server、Service、Engine容器、虚拟主机Host、上下文Context、Executor执行器、Connector连接器等,然后按顺序启动组件,成功后监听端口提供服务。
å¦ä½ä½¿ç¨Bootstrap
æ¹æ³/æ¥éª¤
å°bootstrapå®æ¹ç½ç«ä¸è½½ï¼å¯¹äºæ们å¼åè æ¥è¯´ï¼ç´æ¥ä¸è½½ç¼è¯åå缩åçCSSãJavaScriptæ件ï¼å¦å¤è¿å å«åä½æ件ï¼ä½æ¯ä¸å å«ææ¡£åæºç æ件ãæå¼è§£åå ä¹åå¯ä»¥åç°å å«ä¸ä¸ªæ件夹 cssãfontsãjsãè¿æ¯æåºæ¬çBootstrapç»ç»å½¢å¼ï¼æªå缩ççæ件å¯ä»¥å¨ä»»æweb项ç®ä¸ç´æ¥ä½¿ç¨ãæ们æä¾äºå缩(bootstrap.min.*)ä¸æªå缩 (bootstrap.*)çCSSåJSæ件ãåä½å¾æ æ件æ¥èªäºGlyphicons
ææBootstrapæ件é½ä¾èµjQueryãèä¸å¨æ£å¼ç项ç®å½ä¸æ们æ¨è使ç¨å缩ä¹åççæ¬ï¼å 为å®çä½ç§¯å¾å°ï¼å°å®ç½ä¸è½½jQueryæ¯æï¼å¦å¾ï¼
å°ä¸è½½åçå°±jQueryæ¾å°bootstrapä¸çjsç®å½ä¸ï¼å¦å¾ï¼
å¨bootstrapçæ ¹ç®å½ä¸æ°å»ºä¸ä¸ªdemo.htmlæ件ï¼ï¼æ³¨æï¼å¿ é¡»å¨æ ¹ç®å½ä¸é¢æ°å»ºï¼å 为åé¢çæ¥éª¤ä¸è¦å°bootstrapæ¡æ¶ä¸çcssåjsæ件é¾æ¥å°å建çdemoä¸ï¼
ç¼è¾demo.htmlæ件ï¼æ·»å 对bootstrapæ¡æ¶ä¸cssåjsçå¼ç¨ï¼å 容å¦ä¸ï¼å¾çæ注é说æï¼è¿æ ·ï¼æ们就åºæ¬ä¸å»ºç«äºå¯¹bootstrapæ¡æ¶çåºæ¬ä½¿ç¨æ¶æ
æºç ï¼
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- viewportç<meta>æ ç¾ï¼è¿ä¸ªæ ç¾å¯ä»¥ä¿®æ¹å¨å¤§é¨åç移å¨è®¾å¤ä¸é¢çæ¾ç¤ºï¼ä¸ºäºç¡®ä¿éå½çç»å¶å触å±ç¼©æ¾ã-->
<title>æ æ é¢ææ¡£</title>
<!--æ ·å¼æ件å¼ç¨-->
<link href="css/bootstrap.min.css" rel="stylesheet" type="text/css">
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="/libs/respond.js/1.3.0/respond.min.js"></script>
<![endif]
IE9以ä¸çæµè§å¨å¹¶ä¸æ¯æè¿äºæ ç¾ï¼ä¹ä¸è½ä¸ºè¿äºæ ç¾è¿è¡æ·»å æ ·å¼ãé£ä¹ä¿®å¤è¿ä¸ªé®é¢æ们éè¦é¾æ¥å¼ç¨çæ件
ææå°±æ¯è¯´å¦æç¨æ·IEæµè§å¨ççæ¬å°äºIE9ï¼é£ä¹å°±ä¼å è½½è¿ä¸¤ä¸ªjsæ件åºï¼ç°å¨å°±å¯ä»¥ä½¿ç¨è¿äºæ°çæ ç¾ï¼å¹¶ä¸å¯ä»¥å¨è¿äºæ ç¾ä¸æ·»å æ ·å¼äº
-->
</head>
<body>
<!--JavaScriptæ件é½æ¯ä¾èµä¸jQueryåº-->
<script type="text/javascript" src="js/jquery-2.1.3.min.js"></script>
<script type="text/javascript" src="js/bootstrap.min.js"></script>
</body>
</html>
å¦å¤ï¼bootstrapå®æ¹æä¾äºé¾æ¥æå¡ï¼æ°¸ä¹ å è´¹ï¼å³ä½¿ä½ ä¸ä¸è½½bootstrapæ¡æ¶æ件å°æ¬å°ï¼ä¹å¯ä»¥ç´æ¥å¨htmlä¸ä½¿ç¨ï¼ä½¿ç¨ä¸é¢è¿æ®µä»£ç ï¼
<link href="/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">
<script src="/jquery/2.0.0/jquery.min.js"></script>
<script src="/bootstrap/3.0.3/js/bootstrap.min.js"></script>