springboot省去配置Tomcat的步驟問題
前言
這篇文章探索一下springboot的tomcat是如何實現(xiàn)的
一、起步依賴
1.首先我們了解一下起步依賴
- SpringBoot結(jié)合Maven管理,無需關(guān)注不同的依賴,不同版本是否存在沖突的問題。
- 通過spring-boot-starter-parent、spring-boot-starter等實現(xiàn)依賴的傳遞、版本管理等
SpringBoot存在大量的spring-boot-starter-xxx。這些依賴對某種或某類功能進行了組織,從而達到了起步依賴的目的。
2.上圖直觀的看依賴關(guān)系

我們平常創(chuàng)建好一個SpringBoot項目初始化就會依賴一個spring-boot-starter,當我們想啟動項目的時候,就必須在添上 -web讓他成為一個spring-boot-starter-web項目。
為什么呢?我們點擊進去,這里看

是了!它引入了tomcat的依賴,并且仔細觀看后還有一些其它的依賴

可以看到,當我們把第一層pom中的spring-boot-starter改變?yōu)榱藄pring-boot-starter-web,進來后這個web中又引入了spring-boot-starter!

這里也引入了webMVC的依賴
二、追蹤源碼
把pom中改成web項目后啟動看看 這里成功啟動了

啊這,細心一點的話可以看到中間的路徑類,發(fā)現(xiàn)目標TomcatWebServer
1.TomcatWebServer

可以看到他有一個成員變量屬性tomcat,并且實現(xiàn)了一個WebServer的接口,那這個WebServer的關(guān)系是什么樣呢?

這個接口原來不單單一個tomcat,還有其它可以代替tomcat的Web容器。
看它的構(gòu)造方法,這個構(gòu)造參數(shù)中的tomcat是誰傳入進來的?
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.monitor = new Object();
this.serviceConnectors = new HashMap();
Assert.notNull(tomcat, "Tomcat Server must not be null");
this.tomcat = tomcat;
this.autoStart = autoStart;
this.initialize();
}我們繼續(xù)往下追蹤
2.TomcatServletWebServerFactory
原來是這個類new了一個TomcatWebServer,并且傳入了一個tomcat類。
protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) {
return new TomcatWebServer(tomcat, this.getPort() >= 0);
}那么TomcatServletWebServerFactory類中g(shù)etTomcatWebServer的方法參數(shù)tomcat是誰傳入的呢?我們接著找。

阿,果然還是你,通過本類getWebServer方法返回值調(diào)用了getTomcatWebServer,那么看看這個日日念念的tomcat是怎么來的呢
原來是在這個方法中new了一個tomcat對象!
三、結(jié)尾
我們再來看TomcatWebServer的構(gòu)造方法
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.monitor = new Object();
this.serviceConnectors = new HashMap();
Assert.notNull(tomcat, "Tomcat Server must not be null");
this.tomcat = tomcat; //賦值給類中屬性
this.autoStart = autoStart;
this.initialize();//初始化方法
}現(xiàn)在應(yīng)該知道了吧,其實底層就是new了一個tomcat對象。經(jīng)過這樣一輪傳值傳到這個類的構(gòu)造方法,然后賦值給這個類中的tomcat成員變量,最后調(diào)用初始化方法即可
來看看初始化 initialize() 方法

調(diào)用這個方法,其中start()啟動了,并且設(shè)置了守護線程防止閃退。
流程圖
這里是我理解的一個流程圖,這篇所說的大概就包含這些了

總結(jié)
好了,不知道看完這篇是不是對SpringBoot中內(nèi)嵌式容器tomcat有點點的了解了.
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot統(tǒng)一功能處理示例詳解(攔截器)
這篇文章主要介紹了SpringBoot統(tǒng)一功能處理(攔截器),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08

