1. 程式人生 > 其它 >【博學谷學習記錄】超強總結,用心分享|狂野架構SpringBoot概念和依賴管理

【博學谷學習記錄】超強總結,用心分享|狂野架構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-parentproperties節點

<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定義了:

  1. 工程的Java版本為1.8
  2. 工程程式碼的編譯原始檔編碼格式為UTF-8
  3. 工程編譯後的檔案編碼格式為UTF-8
  4. 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節點,裡面定義了資源過濾,針對applicationymlproperties格式進行了過濾,可以支援支援不同環境的配置,比如application-dev.ymlapplication-test.ymlapplication-dev.propertiesapplication-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檔案中引入這些第三方的依賴啟動器時,切記要配置對應的版本號