【博學谷學習記錄】超強總結,用心分享|狂野架構SpringBoot概念和依賴管理
SpringBoot主要特性
1、 SpringBoot Starter:他將常用的依賴分組進行了整合,將其合併到一個依賴中,這樣就可以一次性新增到專案的Maven或Gradle構建中;
2、 使編碼變得簡單,SpringBoot採用 JavaConfig的方式對Spring進行配置,並且提供了大量的註解,極大的提高了工作效率。
3、 自動配置:SpringBoot的自動配置特性利用了Spring對條件化配置的支援,合理地推測應用所需的bean並自動化配置他們;
4、 使部署變得簡單,SpringBoot內建了三種Servlet容器,Tomcat,Jetty,undertow.我們只需要一個Java的執行環境就可以跑SpringBoot的專案了,SpringBoot的專案可以打成一個jar包。
原始碼剖析-依賴管理
問題:(1)為什麼匯入dependency時不需要指定版本?
在Spring Boot入門程式中,專案pom.xml檔案有兩個核心依賴,分別是spring-boot-starter-parent和spring-boot-starter-web,關於這兩個依賴的相關介紹具體如下
spring-boot-starter-parent
在chapter01專案中的pom.xml檔案中找到spring-boot-starter-parent依賴,示例程式碼如下:
<!-- Spring Boot父專案依賴管理 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
上述程式碼中,將spring-boot-starter-parent依賴作為Spring Boot專案的統一父專案依賴管理,並將專案版本號統一為2.2.9.RELEASE,該版本號根據實際開發需求是可以修改的
使用“Ctrl+滑鼠左鍵”進入並檢視spring-boot-starter-parent底層原始檔,先看spring-boot-starter-parent做了哪些事
首先看spring-boot-starter-parent
的properties
節點
<properties> <main.basedir>${basedir}/../../..</main.basedir> <java.version>1.8</java.version> <resource.delimiter>@</resource.delimiter> <!-- delimiter that doesn't clash with Spring ${} placeholders --> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.target>${java.version}</maven.compiler.target> </properties>
在這裡spring-boot-starter-parent
定義了:
- 工程的Java版本為
1.8
。 - 工程程式碼的編譯原始檔編碼格式為
UTF-8
- 工程編譯後的檔案編碼格式為
UTF-8
- Maven打包編譯的版本
再來看spring-boot-starter-parent
的「build」節點
接下來看POM的build
節點,分別定義了resources
資源和pluginManagement
<resources>
<resource>
<filtering>true</filtering>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>**/application*.yml</include>
<include>**/application*.yaml</include>
<include>**/application*.properties</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<excludes>
<exclude>**/application*.yml</exclude>
<exclude>**/application*.yaml</exclude>
<exclude>**/application*.properties</exclude>
</excludes>
</resource>
</resources>
我們詳細看一下resources
節點,裡面定義了資源過濾,針對application
的yml
、properties
格式進行了過濾,可以支援支援不同環境的配置,比如application-dev.yml
、application-test.yml
、application-dev.properties
、application-dev.properties
等等。
pluginManagement
則是引入了相應的外掛和對應的版本依賴
最後來看spring-boot-starter-parent的父依賴spring-boot-dependencies
spring-boot-dependencies的properties節點
我們看定義POM,這個才是SpringBoot專案的真正管理依賴的專案,裡面定義了SpringBoot相關的版本
<properties>
<main.basedir>${basedir}/../..</main.basedir>
<!-- Dependency versions -->
<activemq.version>5.15.13</activemq.version>
<antlr2.version>2.7.7</antlr2.version>
<appengine-sdk.version>1.9.81</appengine-sdk.version>
<artemis.version>2.10.1</artemis.version>
<aspectj.version>1.9.6</aspectj.version>
<assertj.version>3.13.2</assertj.version>
<atomikos.version>4.0.6</atomikos.version>
<awaitility.version>4.0.3</awaitility.version>
<bitronix.version>2.1.4</bitronix.version>
<byte-buddy.version>1.10.13</byte-buddy.version>
<caffeine.version>2.8.5</caffeine.version>
<cassandra-driver.version>3.7.2</cassandra-driver.version>
<classmate.version>1.5.1</classmate.version>
.......
</properties>
spring-boot-dependencies的dependencyManagement節點
在這裡,dependencies定義了SpringBoot版本的依賴的元件以及相應版本。
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test-autoconfigure</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator-autoconfigure</artifactId>
<version>${revision}</version>
</dependency>
....
</dependencyManagement>
spring-boot-starter-parent
通過繼承spring-boot-dependencies
從而實現了SpringBoot的版本依賴管理,所以我們的SpringBoot工程繼承spring-boot-starter-parent後已經具備版本鎖定等配置了,這也就是在 Spring Boot 專案中部分依賴不需要寫版本號的原因
(2)問題2: spring-boot-starter-parent父依賴啟動器的主要作用是進行版本統一管理,那麼專案執行依賴的JAR包是從何而來的?
spring-boot-starter-web
檢視spring-boot-starter-web依賴檔案原始碼,核心程式碼具體如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
</dependencies>
從上述程式碼可以發現,spring-boot-starter-web依賴啟動器的主要作用是打包了Web開發場景所需的底層所有依賴(基於依賴傳遞,當前專案也存在對應的依賴jar包)
正是如此,在pom.xml中引入spring-boot-starter-web依賴啟動器時,就可以實現Web場景開發,而不需要額外匯入Tomcat伺服器以及其他Web依賴檔案等。
當然,這些引入的依賴檔案的版本號還是由spring-boot-starter-parent父依賴進行的統一管理。
Spring Boot除了提供有上述介紹的Web依賴啟動器外,還提供了其他許多開發場景的相關依賴,我們可以開啟Spring Boot官方文件,搜尋“Starters”關鍵字查詢場景依賴啟動器
列出了Spring Boot官方提供的部分場景依賴啟動器,這些依賴啟動器適用於不同的場景開發,使用時只需要在pom.xml檔案中匯入對應的依賴啟動器即可。
需要說明的是,Spring Boot官方並不是針對所有場景開發的技術框架都提供了場景啟動器,例如阿里巴巴的Druid資料來源等,Spring Boot官方就沒有提供對應的依賴啟動器。為了充分利用Spring Boot框架的優勢,在Spring Boot官方沒有整合這些技術框架的情況下,Druid等技術框架所在的開發團隊主動與Spring Boot框架進行了整合,實現了各自的依賴啟動器,例如druid-spring-boot-starter等。我們在pom.xml檔案中引入這些第三方的依賴啟動器時,切記要配置對應的版本號