首次接觸 Spring Boot 的時候,絕大多數小伙伴應該和我一樣好奇:
為什么 Spring Boot 不需要額外安裝 Tomcat 啊?
到底為什么呢?讓我們帶著好奇心開始今天的旅程吧,
打開上一節我們搭建好的 tobebetterjavaer 專案,找到 pom.xml 檔案,可以在里面看到一個 parent 屬性,代碼如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
什么意思呢?
意思是我們當前的 Spring Boot 專案依賴于 spring-boot-starter-parent 這個父專案,有點 Java 中的繼承(extends)的味道,
怎么查看 spring-boot-starter-parent.pom 檔案的內容呢?
如果你不確定自己的 Maven 本地倉庫在哪里,可以在終端執行 mvn help:effective-settings 命令,

順藤摸瓜,根據 parent 的 groupId、artifactId、version 可以鎖定 spring-boot-starter-parent.pom 檔案的位置,

使用文本編輯器打開以后大致可以看到以下內容:

- 定義了 JDK 的版本為 1.8
- 專案默認的編碼方式為 UTF-8
- Maven 的編譯環境
- 以及父依賴 spring-boot-dependencies
照葫蘆畫瓢,我們按照同樣的方法找到 spring-boot-dependencies.pom 檔案,可以看到這里面定義了一系列的屬性和依賴,差不多 2800 行,

有訊息佇列依賴、commons 工具包依賴、資料庫鏈接依賴、HTTP 鏈接依賴、Spring 家族依賴、Web 服務器依賴等等,
可以說這里是 Spring Boot 專案依賴的版本管理中心,
版本管理中心默認配置了專案所需的所有基礎環境的版本,這些版本會隨著 Spring Boot 版本的升級而不斷變化,也就是說,開發人員不需要再關心這些瑣碎依賴的版本了,交給大管家 Spring Boot 就可以了,
Spring Boot 會幫我們選好最穩定的新版本,這體現出了 Spring Boot 專案的靈魂:“約定優于配置”,你想配置當然可以,但沒必要,按照約定俗成的來就行,
理解了這一點,我們再來繼續看 pom.xml 檔案,里面有一個 spring-boot-starter-web 依賴,這一次,我們直接按住 Ctrl 鍵(macOS 是 Command 鍵),點擊滑鼠左鍵就可以跳轉到 spring-boot-starter-web.pom 的源檔案了,

部分原始碼如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.6.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
<version>2.6.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.6.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.13</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.13</version>
<scope>compile</scope>
</dependency>
spring-web 提供了核心 HTTP 集成,包括一些便捷的 servlet 過濾器, Spring HTTP 呼叫,用于集成其它 web 框架的基礎結構以及技術(Hessian,Burlap),
spring-webmvc 是 Spring MVC 的一個實作,spring-webmvc 依賴于 spring-web,這樣包含它就會間接地添加 spring-web,不必顯示添加 spring-web,
看一下 spring-boot-starter-tomcat 的 pom 檔案:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.6.1</version>
<name>spring-boot-starter-tomcat</name>
<dependencies>
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>1.3.5</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.55</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>tomcat-annotations-api</artifactId>
<groupId>org.apache.tomcat</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
<version>9.0.55</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
<version>9.0.55</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>tomcat-annotations-api</artifactId>
<groupId>org.apache.tomcat</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
從這里可以看出來SpringBoot默認的啟動容器是Tomcat,Tomcat 的組成核心 jakarta.annotation、tomcat-embed-core、tomcat-annotations-api、org.apache.tomcat.embed 全部都通過 Maven 引入過來了,

core 的版本是 9.0.55,Tomcat 官網上最新的 9.0.x 版本是 9.0.56,高了一個版本,

不過無所謂,直接下載 9.0.56 的 src,對比看一下,是否大致相同,

對比之下可以看得出,Spring Boot 引入的 Tomcat 更精簡一點,大體上都是相同的,這也就是為什么Spring Boot 不需要額外安裝 Tomcat 的根本原因了,
Spring Boot 的 starter 已經幫我們搞定過了,這也是Spring Boot 大行其道的重要原因,省去了開發人員配置的時間,更專注于業務邏輯的實作、性能的優化,至于那些繁雜的配置嘛,交給 Spring Boot 這個大管家就可以了,他約定好的東西,只要沒問題,不需要特殊化定制,用就對了,
本篇已收錄至 GitHub 上星標 1.0k+ star 的開源專欄《Java 程式員進階之路》,該專欄風趣幽默、通俗易懂,對 Java 愛好者極度友好和舒適😄,內容包括但不限于 Java 基礎、Java 集合框架、Java IO、Java 并發編程、Java 虛擬機、Java 企業級開發(Git、SSM、Spring Boot)等核心知識點,
star 了這個倉庫就等于成為了一名更優秀的 Java 程式員,可以點擊下面的鏈接跳轉過去 star 見證一下這個令人激動的時刻,
https://github.com/itwanger/toBeBetterJavaer
該專欄目前仍然排在 GitHub Trending 榜單(Java 類的日榜)上,這讓二哥終于體會到了霸榜的快樂!


沒有什么使我停留——除了目的,縱然岸旁有玫瑰、有綠蔭、有寧靜的港灣,我是不系之舟,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/401634.html
標籤:java
