" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot內(nèi)嵌tomcat應(yīng)用原理深入分析

 更新時間:2022年09月27日 08:46:19   作者:CaptainCats  
懂得SpringBoot的童鞋應(yīng)該很清楚,不管應(yīng)用程序是屬于何種類型,都是一個Main方法走遍天下,對于web應(yīng)用,只需要引入spring-boot-starter-web中這個依賴,應(yīng)用程序就好像直接給我們來了個tomcat一樣,對于嵌入式Tomcat,其實也非常簡單,就是調(diào)用Tomcat提供的外部類

springboot版本:2.2.9.RELEASE。

默認Servlet容器

springboot默認支持tomcat、jetty、undertow作為底層容器,

一旦引入spring-boot-starter-web模塊,就默認使用tomcat。

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

切換Servlet容器

排除tomcat依賴;

引入其它的容器。

例如:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<exclusions>
		<exclusion>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
		</exclusion>
	</exclusions>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

內(nèi)嵌tomcat自動配置原理

tomcat自動配置類

打開spring-boot-2.2.9.RELEASE\spring-boot-project\spring-boot-autoconfigure\src\main\resources\META-INF\spring.factories,

這個ServletWebServerFactoryAutoConfiguration就是tomcat的自動配置類,

打開這個類,

EmbeddedTomcat

tomcat工廠類

TomcatServletWebServerFactory,

TomcatServletWebServerFactory有一個getWebServer方法,

@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
	if (this.disableMBeanRegistry) {
		Registry.disableRegistry();
	}
	// 實例化一個tomcat
	Tomcat tomcat = new Tomcat();
	File baseDir = (this.baseDirectory != null) ? this.baseDirectory : createTempDir("tomcat");
	// 設(shè)置tomcat的臨時工作目錄
	tomcat.setBaseDir(baseDir.getAbsolutePath());
	// 默認使用Http11NioProtocol實例化connector
	Connector connector = new Connector(this.protocol);
	connector.setThrowOnFailure(true);
	// 給service添加connector
	tomcat.getService().addConnector(connector);
	customizeConnector(connector);
	tomcat.setConnector(connector);
	// 關(guān)閉熱部署
	tomcat.getHost().setAutoDeploy(false);
	// 配置engine
	configureEngine(tomcat.getEngine());
	for (Connector additionalConnector : this.additionalTomcatConnectors) {
		tomcat.getService().addConnector(additionalConnector);
	}
	prepareContext(tomcat.getHost(), initializers);
	// 實例化TomcatWebServer時會將DispatcherServlet以及一些Filter添加到tomcat
	return getTomcatWebServer(tomcat);
}

實例化tomcat,

TomcatServletWebServerFactory#getTomcatWebServer

TomcatWebServer#TomcatWebServer(org.apache.catalina.startup.Tomcat, boolean)

TomcatWebServer#initialize

到this.tomcat.start();這一步,tomcat就啟動了。

所以一旦TomcatServletWebServerFactory#getWebServer被調(diào)用,內(nèi)嵌的tomcat就會創(chuàng)建并啟動。

何時被調(diào)用

在刷新應(yīng)用上下文的時候,

SpringBootMytestApplication#main

SpringApplication#run(java.lang.Class<?>, java.lang.String...) → SpringApplication#run(java.lang.Class<?>[], java.lang.String[])

SpringApplication#run(java.lang.String…)

SpringApplication#refreshContext

SpringApplication#refresh

AbstractApplicationContext#refresh

AbstractApplicationContext#refresh

onRefresh()

我們關(guān)注下onRefresh();這個方法,看ServletWebServerApplicationContext的實現(xiàn),

ServletWebServerApplicationContext#onRefresh

@Override
protected void onRefresh() {
	super.onRefresh();
	try {
		// 通過Servlet容器工廠TomcatServletWebServerFactory,獲取Servlet容器tomcat
		createWebServer();
	}
	catch (Throwable ex) {
		throw new ApplicationContextException("Unable to start web server", ex);
	}
}

ServletWebServerApplicationContext#createWebServer

可以看到這個類型是TomcatServletWebServerFactory,所以就是在這一步調(diào)用的。

finishRefresh()

AbstractApplicationContext#refresh

AbstractApplicationContext#finishRefresh

ServletWebServerApplicationContext#finishRefresh

@Override
protected void finishRefresh() {
	super.finishRefresh();
	// 實例化(在tomcat啟動時就要完成實例化的Servlet:loadStartUp > 0),打印啟動完成日志。
	WebServer webServer = startWebServer();
	if (webServer != null) {
		publishEvent(new ServletWebServerInitializedEvent(webServer, this));
	}
}

到此這篇關(guān)于Springboot內(nèi)嵌tomcat應(yīng)用原理深入分析的文章就介紹到這了,更多相關(guān)Springboot內(nèi)嵌tomcat內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JVM內(nèi)存增強之逃逸分析

    JVM內(nèi)存增強之逃逸分析

    逃逸分析一種數(shù)據(jù)分析算法,基于此算法可以有效減少Java對象在堆內(nèi)存中的分配。本文將詳細講講逃逸分析的原理與實現(xiàn),需要的可以參考一下
    2022-09-09
  • 淺談Java內(nèi)部類——靜態(tài)內(nèi)部類

    淺談Java內(nèi)部類——靜態(tài)內(nèi)部類

    這篇文章主要介紹了Java靜態(tài)內(nèi)部類的相關(guān)資料,幫助大家更好的理解和學習Java內(nèi)部類的相關(guān)知識,感興趣的朋友可以了解下
    2020-08-08
  • jdk1.8中的for循環(huán)問題記錄

    jdk1.8中的for循環(huán)問題記錄

    這篇文章主要介紹了jdk1.8中的for循環(huán)及jdk1.8 新特性之 forEach 循環(huán)遍歷問題,本文通過實例代碼給大家詳細講解,需要的朋友可以參考下
    2022-11-11
  • java藍橋杯歷年真題及答案整理(小結(jié))

    java藍橋杯歷年真題及答案整理(小結(jié))

    這篇文章主要介紹了java藍橋杯歷年真題及答案整理(小結(jié)),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • Java集合框架之List ArrayList LinkedList使用詳解刨析

    Java集合框架之List ArrayList LinkedList使用詳解刨析

    早在 Java 2 中之前,Java 就提供了特設(shè)類。比如:Dictionary, Vector, Stack, 和 Properties 這些類用來存儲和操作對象組。雖然這些類都非常有用,但是它們?nèi)鄙僖粋€核心的,統(tǒng)一的主題。由于這個原因,使用 Vector 類的方式和使用 Properties 類的方式有著很大不同
    2021-10-10
  • 一文掌握Spring?中?@Component?和?@Bean?區(qū)別(最新推薦)

    一文掌握Spring?中?@Component?和?@Bean?區(qū)別(最新推薦)

    ?@Component?用于標識一個普通的類,@Bean用于配置類里面,在方法上面聲明和配置?Bean?對象,這篇文章主要介紹了Spring?中?@Component?和?@Bean?區(qū)別(最新推薦),需要的朋友可以參考下
    2024-04-04
  • Java設(shè)計模式之單例模式簡介

    Java設(shè)計模式之單例模式簡介

    這篇文章主要介紹了Java設(shè)計模式之單例模式簡介,文中有非常詳細的代碼示例,對正在學習Java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 一篇文章帶你了解初始Spring

    一篇文章帶你了解初始Spring

    這篇文章主要給大家介紹了一個簡單的Spring容器初始化流程的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • Mybatis中的常用OGNL表達式

    Mybatis中的常用OGNL表達式

    這篇文章主要介紹了Mybatis中的常用OGNL表達式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 學習Java之如何正確地跳出循環(huán)結(jié)構(gòu)

    學習Java之如何正確地跳出循環(huán)結(jié)構(gòu)

    我們在利用循環(huán)執(zhí)行重復(fù)操作的過程中,存在著一個需求:如何中止,或者說提前結(jié)束一個循環(huán),所以就給大家講解一下,如何在java代碼中返回一個結(jié)果,如何結(jié)束和跳出一個循環(huán),需要的朋友可以參考下
    2023-05-05

最新評論

宁国市| 即墨市| 望城县| 南华县| 德令哈市| 宽甸| 基隆市| 龙口市| 天气| 宿迁市| 常德市| 姚安县| 湖北省| 阿荣旗| 新宁县| 铁力市| 渝北区| 莆田市| 佛教| 资源县| 扬中市| 绿春县| 临洮县| 淳化县| 宁都县| 汶川县| 元氏县| 明水县| 五大连池市| 临武县| 禄劝| 广西| 绥江县| 涞水县| 呼伦贝尔市| 肃南| 轮台县| 巴中市| 潢川县| 桐庐县| 广宁县|