1. 程式人生 > >Spring Boot 2.0.0參考手冊_中文版

Spring Boot 2.0.0參考手冊_中文版

Spring Boot參考文件

第一部分:Spring Boot文件
1. 關於文件
Sring參考文件可以通過html,pdf和epub 三種形式得到。最新的文件可以從docs.spring.io/spring-boot/docs/current/reference上得到。

2. 獲得幫助
如果在使用Spring Boot中有不會的地方,我們很樂意幫忙!

嘗試How-to’s(文件第九部分),裡面有最常見問題的解決方案。

學習Spring基礎知識——Spring Boot建立在許多其它的Spring工程之上,檢視spring.io網站,上面有大量的參考文件。如果你剛開始使用Spring,嘗試看這些指南中的一個。

問問題——我們監控著stackoverflow.com中標籤為spring-boot的問題。

報告Spring Boot中的bugs請到github.com/spring-projects/spring-boot/issues。

Spring Boot是開源的,包括文件!如果你在文件中發現了問題;或你想改進它們,請參與進去。

3. 第一步
如果你準備開始學習Spring Boot或通常來說的Spring,從這裡開始!

從零開始: 概述 | 要求 | 安裝

學習指南: 第一部分 | 第二部分

執行例子: 第一部分 | 第二部分

4. 使用Spring Boot
準備好開始使用Spring Boot了?不用擔心。

構建系統:Maven | Gradle | Ant | Starters

最佳實踐:Code Structure | @Configuration | @EnableAutoConfiguration | Beans and Dependency Injection

執行程式碼:IDE | Packaged | Maven | Gradle

打包應用:Production jars

Spring Boot命令列:Using the CLI

5. 瞭解Spring Boot特性
需要更多關於Spring Boot核心特性的細節?看下面。

核心特性:SpringApplication | External Configuration | Profiles | Logging

Web應用:MVC | Embedded Containers

訊息:Overview | JMS

測試:Overview | Boot Applications | Utils

擴充套件:Auto-configuration | @Conditions

6. 變為產品
當你準備將你的Spring Boot應用變成產品時,給你推薦一些你可能喜歡的小技巧。

管理端點:Overview | Customization

連結選擇:HTTP | JMX | SSH

監控:Metrics | Auditing | Tracing | Process

7. 高階課題
最後,我們有一些課題給高階使用者。

部署Spring Boot應用:Cloud Deployment | OS Service

構建工具外掛:Maven | Gradle

附錄:Application Properties | Auto-configuration classes | Executable Jars

Part II 開始
如果你剛開始學習Spring Boot或通常所說的Spring,這部分就是為你準備的!這部分中我們回答了基本的”what?”,”how”,”why?”問題,並在安裝說明中介紹Spring Boot。我們將構建第一個Spring Boot應用,討論一些我們遵循的核心原則。

8. Spring Boot介紹
Spring Boot 使建立獨立的、產品級的、基於Spring的應用變得更容易,你只需要執行run即可。我們採用不變的Spring平臺和第三方庫,因此你可以幾乎無差別的使用Spring Boot。大多數Spring Boot應用只需要很少的Spring配置。

你可以使用Spring Boot建立Java應用,用java-jar或更傳統的war包來部署應用。我們也提供了執行”Spring指令碼”的命令列工具。

我們的主要目標是:

為所有Spring開發者提供一個從根本上更迅速可用的入門經驗。

堅持開箱即用,當預設設定不滿足需求時可以快速避免預設設定。

為具有許多類的工程提供一系列常用的非功能特性(例如嵌入式伺服器、安全、度量、健康檢查、外部配置)。

絕對沒有XML配置程式碼產生和XML配置需求。

9. 系統需求
By default, Spring Boot 2.0.0.BUILD-SNAPSHOT requires Java 7 and Spring Framework 5.0.0.BUILD-SNAPSHOT or above. You can use Spring Boot with Java 6 with some additional configuration. See Section 80.11, “How to use Java 6” for more details. Explicit build support is provided for Maven (3.2+) and Gradle (1.12 or 2.x). Gradle 3 is not supported.

預設情況下,Spring Boot 2.0.0.BUILD-SNAPSHOT需要Java 7和Spring Framework 5.0.0.BUILD-SNAPSHOT及以上。你可以通過一些額外配置在Java 6下使用Spring Boot。更多細節請看80.11小節,”怎樣使用Java 6”。明確的構建支援有Maven (3.2+)和Gradle (1.12 or 2.x),不支援Gradle 3。

Although you can use Spring Boot with Java 6 or 7, we generally recommend Java 8 if at all possible.

雖然你可以在Java 6或Java 7下使用Spring Boot,但我們建議儘可能的使用Java 8。

9.1 Servlet容器

下面的嵌入式servlet容器支援開箱即用:

Name Servlet Version Java Version
Tomcat 8 3.1 Java 7+
Tomcat 7 3.0 Java 6+
Jetty 9.3 3.1 Java 8+
Jetty 9.2 3.1 Java 7+
Jetty 8 3.0 Java 6+
Undertow 1.3 3.1 Java 7+
你也可以部署Spring Boot應用到任何相容Servlet 3.0+的容器。

10. 安裝Spring Boot
Spring Boot可以和”經典”的Java開發工具一起使用,也可作為一個命令列工具來進行安裝。不管你是需要Java SDK v.16還是更高版本,在開始之前你應該檢查你當前安裝的Java版本。

$ java -version

如果你是Java開發的新手,或你只想嘗試Spring Boot,你可能首先想試一下Spring Boot CLI,否則,請讀”經典”的安裝說明。

雖然Spring Boot相容Java 1.6,但可能的話,你應該考慮使用Java的最新版本。

10.1 Java開發者的安裝說明

你可以使用Spring Boot像使用任何標準Java庫一樣。簡單的在你的classpath中包含恰當spring-boot-*.jar即可。Spring Boot不需要任何特定的工具整合,因此你可以使用任何IDE或文字編輯器;Spring Boot應用沒有什麼特別的,你可以像其它的Java程式一樣來執行和除錯。

儘管你可以只拷貝Spring Boot的jars,但通常我們建議你使用一個支援依賴管理的構建工具(例如Maven或Gradle)。

10.1.1 Maven安裝

Spring Boot相容Apache Maven 3.2或以上。如果你沒有安裝Maven,你可以根據maven.apache.org的說明來安裝。

在許多作業系統上Maven都能通過包管理器來安裝。如果你是一個OSX Homebrew使用者可以通過brew install maven安裝。Ubuntu使用者可以通過sudo apt-get install maven安裝。

Spring Boot依賴使用org.springframework.boot groupId。通常你的Maven POM檔案將繼承spring-boot-starter-parent工程並宣告一個或多個“Starters”依賴。Spring Boot也提供一個可選的Maven外掛來建立可執行的jar包。

下面是一個典型的pom.xml檔案:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>myproject</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <!-- Inherit defaults from Spring Boot -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.BUILD-SNAPSHOT</version>
    </parent>
    <!-- Add typical dependencies for a web application -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    <!-- Package as an executable jar -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    <!-- Add Spring repositories -->
    <!-- (you don't need this if you are using a .RELEASE version) -->
    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/snapshot</url>
            <snapshots><enabled>true</enabled></snapshots>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <url>http://repo.spring.io/milestone</url>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/snapshot</url>
        </pluginRepository>
        <pluginRepository>
            <id>spring-milestones</id>
            <url>http://repo.spring.io/milestone</url>
        </pluginRepository>
    </pluginRepositories>
</project>

spring-boot-starter-parent是使用Spring Boot的一種極好的方式,但它可能不是一直都合適的。有時你可能需要繼承一個不同的父POM,或者你可能不喜歡我們的預設設定。請看13.2.2小節,『沒有父POM的情況下使用Spring Boot』是一種可替代的解決方案,它使用了import作用域。

10.1.2 Gradle安裝

Spring Boot相容Gradle 1.12或2.x。推薦使用2.14.1。不支援Gradle 3。如果你沒有安裝Gradle,你可以根據www.gradle.org/的介紹來安裝。

Spring Boot依賴使用org.springframework.boot groupId。通常你的工程會宣告一個或多個“Starters”依賴。Spring Boot提供了一個有用的Gradle外掛用來簡化依賴宣告並建立可執行的jar包。

Gradle Wrapper

10.2 安裝Spring Boot CLI

Spring Boot CLI是一個命令列工具,可以用來快速搭建基於Spring的原型。它允許你執行Groovy指令碼,這意味著你有一個熟悉的類Java語法,沒有很多的樣本程式碼。

你不需要使用CLI來使用Spring Boot但它是開始得到一個基於Spring應用的最快方式。

10.2.1 手動安裝

你可以從Spring軟體倉庫下載Spring CLI發行版:

spring-boot-cli-2.0.0.BUILD-SNAPSHOT-bin.zip
spring-boot-cli-2.0.0.BUILD-SNAPSHOT-bin.tar.gz
最新的snapshot distributions也是可獲得的。

一旦下載完成,按照存檔INSTALL.txt中的 介紹來安裝。總結:bin/目錄的.zip檔案中有一個spring指令碼(Windows中是spring.bat),或者你可以使用java -jar執行.jar檔案(這個指令碼幫你確保正確設定classpath)。

10.2.2 使用SDKMAN!安裝

SDKMAN! (The Software Development Kit Manager)能用來管理各種二進位制SDKs的多個版本,包括Groovy和Spring Boot CLI。從sdkman.io中得到SDKMAN!並安裝Spring Boot:

$ sdk install springboot
$ spring --version
Spring Boot v2.0.0.BUILD-SNAPSHOT

如果你在為CLI開發功能並向很容易的訪問你夠簡單版本,按照這些額外的介紹去做。

$ sdk install springboot dev /path/to/spring-boot/spring-boot-cli/target/spring-boot-cli-2.0.0.BUILD-SNAPSHOT-bin/spring-2.0.0.BUILD-SNAPSHOT/
$ sdk default springboot dev
$ spring --version

Spring CLI v2.0.0.BUILD-SNAPSHOT
這將會安裝一個名為dev的本地spring例項。它指向你的目標構建位置,因此你每次重新構建Spring Boot,spring將是最新的。

按下面去做你會看到:

$ sdk ls springboot

Available Springboot Versions

  • dev

* 2.0.0.BUILD-SNAPSHOT

    • local version
    • installed

> - currently in use

10.2.3 OSX Homebrew安裝

如果你在Mac上使用Homebrew,安裝Spring Boot CLI所有你需要做的是:

$ brew tap pivotal/tap
$ brew install springboot

Homebrew會在/usr/local/bin目錄安裝spring。

如果你沒有看到公式,你安裝的brew可能過時了。執行brew update並重新再試一次。

10.2.4 MacPorts安裝

如果你在Mac上使用MacPorts,安裝Spring Boot CLI所有你需要做的是:

1
$ sudo port install spring-boot-cli
10.2.5 命令列實現

Spring Boot CLI附帶的指令碼為BASH和zsh shells提供了命令列實現。你可以在任何shell中source指令碼(也稱為spring),或將它放在使用者或系統範圍內的bash完成初始化。在Debian系統中系統範圍內的指令碼是在/shell-completion/bash目錄中,當新shell啟動時,目錄下的所有指令碼都被執行。如果你裝了SDKMAN!,為了手動執行指令碼,執行下面的命令:

$ . ~/.sdkman/candidates/springboot/current/shell-completion/bash/spring
$ spring <HIT TAB HERE>
  grab  help  jar  run  test  version

如果你想使用Homebrew或MacPorts安裝Spring Boot CLI,命令列完成指令碼會自動在shell中註冊。

10.2.6 快速Spring CLI例子

這兒有一個真實的簡單的web應用,你可以用來測試你的安裝。建立一個檔案叫app.groovy:

@RestController
class ThisWillActuallyRun {
    @RequestMapping("/")
    String home() {
        "Hello World!"
    }
}

這兒有一個真實的簡單的web應用,你可以用來測試你的安裝。建立一個檔案叫app.groovy:

@RestController
class ThisWillActuallyRun {
    @RequestMapping("/")
    String home() {
        "Hello World!"
    }
}

當你第一次執行應用時它需要一段時間,因為要下載依賴。接下來執行會更快。

在你最喜歡的瀏覽器中輸入localhost:8080,你應該會看到下面的結果:

Hello World!

10.3 從早期的Spring Boot升級

如果正在升級你的Spring Boot,檢查project wiki中的『釋出說明』。你將找到升級說明,說明中有每一次釋出的特性列表。

為了升級現有的CLI,要使用合適的包管理命令(例如brew upgrade),如果你手動安裝的CLI,要按照標準的說明去做,為了移除舊的引用要記住更新你的PATH環境變數。

  1. 開發你的第一個Spring Boot應用
    我們用Java開發一個簡單的Web應用“Hello World!”,通過應用來強調Spring Boot的一些關鍵特性。由於大多數IDE都支援Maven,因此我們用Maven來構建這個專案。

spring.io網站上有許多使用Spring Boot的“Getting Started”指南。如果你要解決一個特定的問題;先去網站上看一下。

你可以通過到start.spring.io上並從依賴搜尋器中選擇web啟動器來簡化下面的步驟。這會自動的產生一個新的工程結構所以你能以正確的方式開始編碼。更多細節請看文件。

$ java -version

java version “1.7.0_51”
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)

$ mvn -v

Apache Maven 3.2.3 (33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-11T13:58:10-07:00)
Maven home: /Users/user/tools/apache-maven-3.1.1
Java version: 1.7.0_51, vendor: Oracle Corporation
這個例子需要建立它自己的資料夾。接下來的介紹假設你已經建立了合適的資料夾並且資料夾是你的當前目錄。

11.1 建立POM檔案

我們首先需要建立一個Maven的pom.xml檔案。pom.xml是用來構建專案的處方。開啟你最喜歡的文字編輯器並新增以下內容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>myproject</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.BUILD-SNAPSHOT</version>
    </parent>
    <!-- Additional lines to be added here... -->
    <!-- (you don't need this if you are using a .RELEASE version) -->
    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/snapshot</url>
            <snapshots><enabled>true</enabled></snapshots>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <url>http://repo.spring.io/milestone</url>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/snapshot</url>
        </pluginRepository>
        <pluginRepository>
            <id>spring-milestones</id>
            <url>http://repo.spring.io/milestone</url>
        </pluginRepository>
    </pluginRepositories>
</project>

11.2 新增classpath依賴

Spring Boot提供了許多“Starters”,這樣可以很容器的在classpath中新增jar包。我們的例子程式已經在POM的parent部分使用了spring-boot-starter-parent。spring-boot-starter-parent是一個特別的啟動器,它能提供有用的Maven預設設定。它也提供了依賴管理部分,因此你可以對“blessed”依賴忽略其版本標籤。

當開發一個特定的應用時,其它的“Starters”簡單的提供了你可能需要的依賴。由於我們正在開發一個web應用,我們將新增spring-boot-starter-web依賴——但在那之前,讓我們先看一下目前有什麼。

$ mvn dependency:tree

[INFO] com.example:myproject:jar:0.0.1-SNAPSHOT
11.3 寫程式碼

為了完成我們的應用,我們需要建立一個簡單的Java檔案。Maven預設的將從src/main/java編譯原始碼,因此你需要建立檔案結構,然後新增名為src/main/java/Example.java的檔案:

import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
public class Example {
    @RequestMapping("/")
    String home() {
        return "Hello World!";
    }
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Example.class, args);
    }
}

儘管這兒沒有太多程式碼,許多正在進行中。讓我們一步步瀏覽這些重要的部分。

11.3.1 @RestController和@RequestMapping註解

Example類中的第一個註解是@RestController。這是一個模式化的註解。它為閱讀程式碼的人提供了暗示,對於Spring而言,這個類有一個特定的任務。在這個例子中,我們的類是一個web @Controller,當web請求到來時,Spring會考慮用它來處理。

@RequestMapping註解提供了『路由』資訊。它告訴Spring任何帶有路徑”/“的HTTP請求應該對映到home方法上。@RestController註解告訴Spring將結果渲染成字串形式並直接返回給呼叫者。

@RestController和@RequestMapping是Spring MVC註解(它們不是Spring Boot特有的)。更多細節請看Spring參考文件中MVC部分。

11.3.2 @EnableAutoConfiguration註解

第二個類級別的註解是@EnableAutoConfiguration。這個註解告訴Spring Boot基於你新增的jar依賴去”猜”你想怎樣配置Spring。由於spring-boot-starter-web添加了Tomcat和Spring MVC,自動配置會假設你正在開發一個web應用並相應的設定Spring。

啟動器和自動化配置

自動配置被設計成跟『啟動器』能一起工作的很好,但這兩個概念沒有直接聯絡。你可以自由的挑選啟動器之外的jar依賴,Spring Boot仍會最大程度地自動配置你的應用。

11.3.3 The “main” method

程式的最後部分是main方法。這是一個符合Java應用程式入口規範的標準方法。main方法中委託Spring Boot的SpringApplication類呼叫run方法。SpringApplication將引導我們的應用啟動Spring,Spring將啟動自動配置的Tomcat web伺服器。我們需要將Example.class作為引數傳給run方法,告訴SpringApplication它是主要的Spring元件。args陣列會將所有命令列引數傳給run方法。

11.4 執行這個例子

此時我們的應用應該工作了。既然我們已經使用了spring-boot-starter-parent POM,那我們有一個有用的run目標,我們使用它來啟動應用。在工程的根目錄中輸入mvn spring-boot:run來啟動應用。

$ mvn spring-boot:run
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v2.0.0.BUILD-SNAPSHOT)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.222 seconds (JVM running for 6.514)
如果你開啟一個web瀏覽器,輸入localhost:8080,你應該會看到下面的輸出。`
Hello World!

可以點選ctrl-c退出應用。

Spring Boot 2.0.0參考手冊中文版持續更新

通過建立一個在產品中能執行的完整的自包含可執行jar檔案來結束我們的例子。可執行jars(有時稱為“fat jars”)是包含編譯的類和程式碼執行需要的所有jar依賴的存檔檔案。

可執行jars和Java

Java沒有提供任何標準方法來載入巢狀的jar檔案(例如,jar檔案本身包含在一個一個jar中)。如果你想分發一個自包含的應用,這可能是個問題。

為了解決這個問題,許多開發者使用“uber” jars。uber jar簡單的將所有jars的所有類打包到一個單獨的存檔檔案中。這個方法的問題是很難看到你的應用正在使用的是哪個庫。如果多個jars使用了相同的檔名(不同的內容)也是個問題。

Spring Boot採用了一種不同的方法來處理這個問題,允許你真正的直接內嵌jars。

為了建立可執行jar,我們需要新增spring-boot-maven-plugin到pom.xml中。在dependencies部分下面插入以下內容:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

spring-boot-starter-parent POM包含繫結repackage目標的配置。如果你沒有使用父POM,那你需要自己宣告這個配置。更多細節請看外掛文件。

儲存你的pom.xml並從命令列中執行mvn package:

$ mvn package

[INFO] Scanning for projects…
[INFO]
[INFO] ————————————————————————
[INFO] Building myproject 0.0.1-SNAPSHOT
[INFO] ————————————————————————
[INFO] …. ..
[INFO] — maven-jar-plugin:2.4:jar (default-jar) @ myproject —
[INFO] Building jar: /Users/developer/example/spring-boot-example/target/myproject-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] — spring-boot-maven-plugin:2.0.0.BUILD-SNAPSHOT:repackage (default) @ myproject —
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
[INFO] ————————————————————————
如果你看一下目錄target你應該看到myproject-0.0.1-SNAPSHOT.jar。這個檔案大小應該在10 Mb左右。如果你想看裡面的內容,你可以使用:jar tvf

1
$ jar tvf target/myproject-0.0.1-SNAPSHOT.jar
你在target目錄中應該也能看到一個更小的名為myproject-0.0.1-SNAPSHOT.jar.original的檔案。這是Spring Boot repackage之前Maven建立的最初的jar檔案。

為了執行這個應用,要使用java -jar命令:

$ java -jar target/myproject-0.0.1-SNAPSHOT.jar

. _ _ _
/\ / _ ()_ _ _ _ \ \ \ \
( ( )___ | ‘_ | ‘| | ‘ \/ _` | \ \ \ \
\/ _)| |)| | | | | || (| | ) ) ) )
’ |_| .|| ||| |_, | / / / /
=========||==============|__/=///_/
:: Spring Boot :: (v2.0.0.BUILD-SNAPSHOT)
……… .
……… . (log output here)
……… .
…….. Started Example in 2.536 seconds (JVM running for 2.864)
像前面一樣,通過點選ctrl-c來退出應用。

12. 接下來讀什麼
希望這部分內容給你提供了一些Spring Boot的基本知識,讓你寫了你自己的應用。如果你是一個面向任務的開發人員,你可能想跳到spring.io,找出一些getting started指南來解決特定的『用Spring怎樣做』的問題;我們也提供了Spring Boot的How-to參考文件。

Spring Boot repository也有一些你可以執行的例子。例子是獨立於其它程式碼的(執行或使用例子時你不需要構建其它的內容)。

此外,按邏輯接下來是讀第三部分,『使用Spring Boot』。如果你真的不耐煩,你也跳過這部分,直接閱讀Spring Boot的特性。

Part III. 使用Spring Boot
這一節將會講述關於應該如何使用Spring Boot的更多細節。它包括許多主題例如構建系統,自動配置和怎麼執行自己的應用。我們也講述一些Spring Boot的最佳實踐。雖然沒有關於Spring Boot非常特別的東西(它只是另一個你可以使用的庫),但接下來的一些建議可以讓你的開發過程更容易一點。

如果你剛開始學習Spring Boot,在學習這節之前你可能應該先閱讀一下『Getting Started』部分。

13. 構建系統
強烈建議你選擇一個支援依賴管理的構建系統,構建系統可以使用釋出在『Maven Central』倉庫中的工件。我們建議你選擇Maven或Gradle。Spring Boot可能也可以與其它的構建系統進行協作(例如Ant),但不能特別好的支援其它的構建系統。

13.1 依賴管理

Spring Boot的每一次釋出都會提供它支援的依賴列表。實際應用時,在你的構建配置中不需要提供這些依賴的版本,因為Spring Boot會幫你進行管理。當你升級Spring Boot時,這些依賴也會隨之進行升級。

如果有必要的話,你仍可以指定版本並覆蓋Spring Boot的推薦。

這個列表包含了所有你在Spring Boot中可以使用的Spring模組,也包含了第三方庫的精製列表。這個列表可以當做一個標準可用的Bills of Materials (spring-boot-dependencies),也額外的專門支援Maven和Gradle可用。

Spring Boot的每一次釋出都是與Spring框架的基本版本相關的,因此我們強烈建議你在自己使用時不要指定它的版本。

13.2 Maven

Maven使用者可以繼承spring-boot-starter-parent工程來獲得合理的預設配置。父工程提供了下面的特性:

Java 1.6作為預設的編譯級別。

UTF-8原始碼編碼。

依賴管理部分,對於常用的依賴允許你忽略標籤,從spring-boot-dependencies繼承POM。

合理的資源過濾。

合理的外掛配置(exec plugin, surefire, Git commit ID, shade)。

對包括特定配置檔案的application.properties和application.yml的合理資源過濾(例如,application-foo.properties和application-foo.yml)。

最後一點:由於預設配置檔案採用Spring風格的佔位符(${…​}),Maven過濾改成了使用@[email protected]佔位符(你可以使用Maven屬性resource.delimiter來覆蓋)。

13.2.1 繼承starter parent

為了配置你的工程繼承spring-boot-starter-parent,簡單的設定parent:

<!-- Inherit defaults from Spring Boot -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.BUILD-SNAPSHOT</version>
</parent>

你應該只需要在這個依賴中指定Spring Boot的版本號。如果你匯入額外的starters,你可以安全的忽略這個版本號。

有了這個設定,你也可以通過在你的工程中重寫一個屬性來覆蓋單獨的依賴。例如,為了升級另一個Spring Data的釋出版本,你將需要在你的pom.xml中新增以下內容:

<properties>
    <spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>

檢查spring-boot-dependencies pom支援的屬性清單。

13.2.2 沒有父POM的情況下使用Spring Boot

不是每個人都喜歡繼承spring-boot-starter-parent POM的。你也可以有需要使用的公司的標準父POM,或者你可能更喜歡顯式的宣告你所有的Maven配置。

如果你不想使用spring-boot-starter-parent,但你仍要保留依賴管理的好處(不是外掛管理),你可以使用scope=import依賴:

<dependencyManagement>
     <dependencies>
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.0.0.BUILD-SNAPSHOT</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

這個設定不允許你使用上面闡述的屬性來重寫單獨的依賴。為了取得同樣的效果,你需要在spring-boot-dependencies入口之前在工程的dependencyManagement中的新增一個入口。為了升級另一個Spring Data的釋出版本,你將需要在你的pom.xml中新增以下內容:

<dependencyManagement>
    <dependencies>
        <!-- Override Spring Data release train provided by Spring Boot -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-releasetrain</artifactId>
            <version>Fowler-SR2</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.0.0.BUILD-SNAPSHOT</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

在上面的例子中,我們指定了一個POM但任何依賴型別都可以被重寫。

13.2.3 更改Java版本

spring-boot-starter-parent選擇了相當保守的Java相容性。如果你想聽從我們的建議,使用更新的Java版本,你可以新增java.version屬性。

<properties>
    <java.version>1.8</java.version>
</properties>

13.2.4 使用Spring Boot Maven外掛

Spring Boot包含了一個Maven外掛,這個外掛可以將工程打包為一個可執行的jar包。如果你向使用它的話,將它新增到你的部分:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

如果你想使用Spring Boot的starter parent pom,你只需要新增這個外掛,不需要配置它,除非你想更改父POM中的定義的設定。

13.3 Gradle

Gradle使用者可以直接在它們的dependencies部分匯入starters。不像Maven,這兒不能匯入“super parent”來共享一些配置。

apply plugin: 'java'
repositories {
    maven { url "http://repo.spring.io/snapshot" }
    maven { url "http://repo.spring.io/milestone" }
}
dependencies {
    compile("org.springframework.boot:spring-boot-starter-web:2.0.0.BUILD-SNAPSHOT")
}

spring-boot-gradle-plugin也可用,並提供了從原始碼建立可執行jars和執行專案的功能。它也提供了依賴管理,在其它的相容性之間,允許你忽略任何Spring Boot管理的依賴的版本號:

buildscript {
    repositories {
        maven { url "http://repo.spring.io/snapshot" }
        maven { url "http://repo.spring.io/milestone" }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.0.BUILD-SNAPSHOT")
    }
}
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
repositories {
    maven { url "http://repo.spring.io/snapshot" }
    maven { url "http://repo.spring.io/milestone" }
}
dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile("org.springframework.boot:spring-boot-starter-test")
}

13.4 Ant

使用Apache Ant+Ivy來建立一個Spring Boot專案是可能的。spring-boot-antlib “AntLib”模組也可以用來幫助Ant建立可執行jars。

為了宣告依賴,一個典型的ivy.xml檔案如下所示:

<ivy-module version="2.0">
    <info organisation="org.springframework.boot" module="spring-boot-sample-ant" />
    <configurations>
        <conf name="compile" description="everything needed to compile this module" />
        <conf name="runtime" extends="compile" description="everything needed to run this module" />
    </configurations>
    <dependencies>
        <dependency org="org.springframework.boot" name="spring-boot-starter"
            rev="${spring-boot.version}" conf="compile" />
    </dependencies>
</ivy-module>

一個典型build.xml如下所示:

<project
    xmlns:ivy="antlib:org.apache.ivy.ant"
    xmlns:spring-boot="antlib:org.springframework.boot.ant"
    name="myapp" default="build">
    <property name="spring-boot.version" value="1.3.0.BUILD-SNAPSHOT" />
    <target name="resolve" description="--> retrieve dependencies with ivy">
        <ivy:retrieve pattern="lib/[conf]/[artifact]-[type]-[revision].[ext]" />
    </target>
    <target name="classpaths" depends="resolve">
        <path id="compile.classpath">
            <fileset dir="lib/compile" includes="*.jar" />
        </path>
    </target>
    <target name="init" depends="classpaths">
        <mkdir dir="build/classes" />
    </target>
    <target name="compile" depends="init" description="compile">
        <javac srcdir="src/main/java" destdir="build/classes" classpathref="compile.classpath" />
    </target>
    <target name="build" depends="compile">
        <spring-boot:exejar destfile="build/myapp.jar" classes="build/classes">
            <spring-boot:lib>
                <fileset dir="lib/runtime" />
            </spring-boot:lib>
        </spring-boot:exejar>
    </target>
</project>

如果你不想使用spring-boot-antlib模組,請看79.10小節,“Build an executable archive from Ant without using spring-boot-antlib” “How-to”。

13.5 Starters

啟動器是一系列你可以包含進自己應用中的實用依賴描述符。你可以得到所有Spring和你需要的相關技術的一站式服務,不需要有搜尋樣例程式碼和拷貝貼上依賴描述符的負擔。例如,如果你想開始使用Spring和JPA來進行資料庫連結,只需要在你的工程中包含spring-boot-starter-data-jpa依賴,你便可以很好的前行了。

啟動器包含許多你需要啟動並快速執行一個工程的依賴,並持續支援一系列傳遞管理的依賴。

What’s in a name

所有的官方啟動器都有一個類似的命名模式:spring-boot-starter-是應用的特性型別。這個命名結構用來在你需要時幫助你發現一個啟動器。Maven在許多IDEs中進行了整合,允許你通過名字來搜尋依賴。例如,安裝了合適的Eclipse或STS外掛,你可以簡單的在POM編輯器中點選ctrl-space並輸入“spring-boot-starter”來查詢一個完整的列表。

正如在建立你自己的啟動器部分講述的那樣,第三方啟動器不應該與spring-boot一起啟動,因為它是預留給官方Spring Boot構建的。acme的第三方啟動器通過命名為acme-spring-boot-starter。

下面的應用啟動器由Spring Boot提供,在org.springframework.boot組下:

表13.1. Spring Boot應用啟動器

Name Description POM
spring-boot-starter-thymeleaf Starter for building MVC web applications using Thymeleaf views POM
spring-boot-starter-data-couchbase Starter for using Couchbase document-oriented database and Spring Data Couchbase POM
spring-boot-starter-artemis Starter for JMS messaging using Apache Artemis POM
spring-boot-starter-web-services Starter for using Spring Web Services POM
spring-boot-starter-mail Starter for using Java Mail and Spring Framework’s email sending support POM
spring-boot-starter-data-redis Starter for using Redis key-value data store with Spring Data Redis and the Jedis client POM
spring-boot-starter-web Starter for building web, including RESTful, applications using Spring MVC. Uses Tomcat as the default embedded container POM
spring-boot-starter-data-gemfire Starter for using GemFire distributed data store and Spring Data GemFire POM
spring-boot-starter-activemq Starter for JMS messaging using Apache ActiveMQ POM
spring-boot-starter-data-elasticsearch Starter for using Elasticsearch search and analytics engine and Spring Data Elasticsearch POM
spring-boot-starter-integration Starter for using Spring Integration POM
spring-boot-starter-test Starter for testing Spring Boot applications with libraries including JUnit, Hamcrest and Mockito POM
spring-boot-starter-jdbc Starter for using JDBC with the Tomcat JDBC connection pool POM
spring-boot-starter-mobile Starter for building web applications using Spring Mobile POM
spring-boot-starter-validation Starter for using Java Bean Validation with Hibernate Validator POM
spring-boot-starter-hateoas Starter for building hypermedia-based RESTful web application with Spring MVC and Spring HATEOAS POM
spring-boot-starter-jersey Starter for building RESTful web applications using JAX-RS and Jersey. An alternative to spring-boot-starter-web POM
spring-boot-starter-data-neo4j Starter for using Neo4j graph database and Spring Data Neo4j POM
spring-boot-starter-websocket Starter for building WebSocket applications using Spring Framework’s WebSocket support POM
spring-boot-starter-aop Starter for aspect-oriented programming with Spring AOP and AspectJ POM
spring-boot-starter-amqp Starter for using Spring AMQP and Rabbit MQ POM
spring-boot-starter-data-cassandra Starter for using Cassandra distributed database and Spring Data Cassandra POM
spring-boot-starter-social-facebook Starter for using Spring Social Facebook POM
spring-boot-starter-jta-atomikos Starter for JTA transactions using Atomik