tomcat深入學習(二)(1) ---- tomcat初始化
tomcat的初始化流程:
現階段,我們使用tomcat有兩種方式:
- 官網下載tomcat,將web專案打成war包部署到tomcat的webapps目錄下,具體使用請參考新增連結描述。
這種方式啟動時通過點選startup.bat,其底層是呼叫名為Bootstrap.class的main方法。
public final class Bootstrap {
public static void main(String args[]) {
synchronized (daemonLock) {
if (daemon == null) {
// Don't set daemon until init() has completed
Bootstrap bootstrap = new Bootstrap();
try {
bootstrap.init();
...省略
}
}
有興趣的童鞋可以跟進看看。這裡我們主要強調下面這種方式,也是目前使用最多的方式。
- springboot內建tomcat。
在深入之前,我想說的是,內建的tomcat其底層實現與官網tomcat有些許差異,但架構層面還是一樣的,是springboot官方做了許多優化。簡單列舉一下:
原:server:service:engine:host:context:wrapper
1 : n : n : n2 : n3 : n4 (這個有點不確定)
springboot:server:service:engine:host:context:wrapper
1 : 1 : 1 : 1 : 1: 1
這種優化有利有弊吧。
接下來進入正題:
- springboot是如何建立tomcat server的?
// spring容器在初始化時會 有個重新整理容器的操作
public abstract class AbstractApplicationContext extends DefaultResourceLoader
implements ConfigurableApplicationContext {
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
initMessageSource();
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
// 容器在這裡被建立
onRefresh();
// Check for listener beans and register them.
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();
}
...省略
}
}
}
//1. ServletWebServerApplicationContext # onRefresh()
//2. ServletWebServerApplicationContext # createWebServer()
//3. TomcatServletWebServerFactory # getWebServer()
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
if (this.disableMBeanRegistry) {
Registry.disableRegistry();
}
Tomcat tomcat = new Tomcat();
File baseDir = (this.baseDirectory != null) ? this.baseDirectory : createTempDir("tomcat");
tomcat.setBaseDir(baseDir.getAbsolutePath());
// 建立 connector 聯結器
Connector connector = new Connector(this.protocol);
connector.setThrowOnFailure(true);
// 1.建立 tomcat server / service,並設定層級關係 ; 並給 service 繫結 connector
tomcat.getService().addConnector(connector);
customizeConnector(connector);
tomcat.setConnector(connector);
// 2. 建立 engine / host,並設定層級關係 ; 並關閉自動部署 setAutoDeploy(false) ,提高效能
tomcat.getHost().setAutoDeploy(false);
configureEngine(tomcat.getEngine());
for (Connector additionalConnector : this.additionalTomcatConnectors) {
tomcat.getService().addConnector(additionalConnector);
}
prepareContext(tomcat.getHost(), initializers);
return getTomcatWebServer(tomcat);
}
//4. TomcatServletWebServerFactory # getTomcatWebServer()
protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) {
return new TomcatWebServer(tomcat, getPort() >= 0, getShutdown());
}
- tomcat裡面的元件是如何初始化的?
// 在 TomcatWebServer 建構函式中 呼叫了初始化方法 initialize();
暫未完成
相關文章
- Tomcat學習總結1Tomcat
- Tomcat深入淺出——Servlet(二)TomcatServlet
- 大飛帶你深入理解Tomcat(二)Tomcat
- 《深入剖析Tomcat》讀書筆記(二)Tomcat筆記
- 深入淺出Tomcat/4 - Tomcat容器Tomcat
- 深入剖析Tomcat讀書筆記(1)——tomcat的連線本質Tomcat筆記
- Tomcat&Servlet學習TomcatServlet
- Tomcat學習筆記Tomcat筆記
- 學習Tomcat(七)之Spring內嵌TomcatTomcatSpring
- 深入理解 Tomcat (二) 從巨集觀上理解 Tomcat 元件及架構Tomcat元件架構
- 深入淺出Tomcat/3 - Tomcat生命週期Tomcat
- 深入淺出Tomcat/2 - Tomcat啟動和停止Tomcat
- 深入淺出Tomcat系列Tomcat
- Tomcat深入淺出(一)Tomcat
- java web視訊學習-TomcatJavaWebTomcat
- #Tomcat學習(3)#Tomcat多例項配置和反向代理叢集配置Tomcat
- Tomcat 學習進階歷程之Tomcat架構與核心類分析Tomcat架構
- Tomcat (1) —— Mac下配置Tomcat Https/SSLTomcatMacHTTP
- 曹工說Tomcat3:深入理解 Tomcat DigesterTomcat
- Tomcat深入淺出——Servlet(三)TomcatServlet
- 學習Tomcat(一)之容器概覽Tomcat
- 深入淺出Tomcat/1- 來歷和配置檔案Tomcat
- 深入學習Redis(二)Redis
- 學習Tomcat,我們應該懂的Tomcat
- 學習Tomcat(三)之容器聯結器Tomcat
- 學習Tomcat(四)之Engine和Host容器Tomcat
- DNS深入學習-1DNS
- Tomcat 學習筆記(3) – Host 主機配置Tomcat筆記
- JavaWeb學習筆記——Tomcat資料來源JavaWeb筆記Tomcat
- 狂神說Java Web學習筆記_TomcatJavaWeb筆記Tomcat
- Tomcat深入淺出——Session與Cookie(四)TomcatSessionCookie
- Tomcat深入淺出——Filter與Listener(五)TomcatFilter
- Tomcat深入淺出——最終章(六)Tomcat
- 大飛帶你深入理解Tomcat(七)Tomcat
- 《深入剖析Tomcat》讀書筆記(一)Tomcat筆記
- 深入理解 Tomcat(一)原始碼環境搭建和 How Tomcat works 原始碼Tomcat原始碼
- Java學習筆記-Day52 JavaWeb、Tomcat、ServletJava筆記WebTomcatServlet
- JNDI學習(一) Tomcat7 配置JNDI (JDBC datasource)TomcatJDBC