SpringBoot2.x參考指南(中文版) 第二部分 開始入門
轉載請註明出處:http://blog.csdn.net/hitliuxiaodong/article/details/53259797
本人水平有限,翻譯中的錯誤還請多多指教
如果你第一次使用SpringBoot或者剛接觸Spring,這部分就是為你準備噠。在這裡我們將回答:是什麼?為什麼?怎麼做?三個基本的問題。隨著SpringBoot的安裝,你將對SpringBoot有一個基本的印象。我們接下來將開始構建我們第一個SpringBoot專案,也會討論一下核心準則。
8.SpringBoot的介紹
SpringBoot使得構建可以直接執行的獨立、可釋出的Spring專案變得非常容易。我們將Spring庫和其他第三方庫整合進來,使你可以沒有很多疑惑的開始構建專案。大部分SpringBoot專案需要很少的Spring配置就夠了。
你可以使用SpringBoot構建通過java -jar
我們的初級目標是:
- 提供一個從根本上快速簡潔的Spring開發體驗
- 提供諸多非必須的但是在大型的專案中很常見的功能(比如:整合的伺服器,安全等)
無須生成程式碼和xml配置
9.系統要求
預設情況下,SpringBoot2.0.0.Build-SnapShot需要java7和SpringFramework5.0.0Build-Snapshot或者更高的版本。你也可以使用java6,不過需要一些額外的配置。請看第 Section 80.11。構建工具需要Maven(3.2+)或者Gradle2(2.9+)。Gradle3不提供支援。儘管你可以使用java6或者java7,不過我們還是建議你儘可能的使用java8
9.1 Servlet容器
下面的容器是SpringBoot內部整合的
Name | ServletVersion | Java version |
---|---|---|
Tomcat8 | 3.1 | java7+ |
Tomcat7 | 3.0 | java6+ |
Jetty9.3 | 3.1 | java8+ |
Jetty9.2 | 3.1 | java7+ |
Jetty8 | 3.1 | java6+ |
Undertow 1.3 | 3.1 | java7+ |
你也可以在任何支援Servlet 3.0+的容器中部署SpringBoot專案
10.安裝SpringBoot
SpringBoot可以使用傳統的Java開發工具或者命令列工具。但是無論如何你需要使用java1.6或者更高版本。你可以使用以下命令檢查java版本
$java -version
如果你是一枚Java開發新手,或者你只是想體驗一下SpringBoot,你可以嘗試使用 SpringBootCLI 工具,或者閱讀一下安裝指南。
儘管SpringBoot可以在java1.6上執行良好,如果可能的話還是要用Java的最新版本
10.SpringBoot安裝指南
你可以像使用傳統的Java庫一樣使用SpringBoot,也就是把sping-boot-*.jar
放到你的classpath中。SpringBoot不需要額外的外掛整合,因此你可以使用任何IDE或者文字編輯器。另外SpringBoot專案和普通的java專案沒有什麼區別,因此你可以向執行除錯普通java專案一樣執行除錯SpringBoot專案。
儘管你可以只把jar包拷貝到構建路徑,不過我們還是強烈建議你使用構建工具(比如Maven或者Gradle)
10.1.1 Maven配置
SpringBoot可以和ApacheMaven3.2及以上版本正常工作。如果你沒有安裝Maven,可以參考 教程
在大多數作業系統上,可以通過包管理工具安裝Maven。如果你是 OSx系統,可以使用
brew install maven
Ubuntu系統可以使用sudo apt-get install maven
SpringBoot的依賴使用 org.springframework.boot
groupId
。一個典型的SpringBoot專案的pom需要繼承 spring-boot-starter-parent
依賴於 一個或者多個 “Starters”.SpringBoot也提供 Maven plugin 來建立可執行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>
使用SpringBoot的最好方法是 繼承
spring-boot-starter-parent
,不過有時候並不合適。有時需要使用繼承自其他 父 pom ,或者不想使用預設的設定。這時候 請看下面 的教程
10.1.2 Gradle配置
SpringBoot相容Gradle2(2.9+).推薦 Gradle2.14.1,Gradle3是不支援的。如果你沒有安裝Gradle,請參照Gradle官方安裝教程www.gradle.org
SpringBoot的依賴需要用 org.springframework.boot
groupId
。你的專案可能需要宣告一個或者多個 “Starters”的依賴。SpringBoot也提供了一個外掛Gradle plugin供生成可執行的jar包
Gradle Wrapper
GradleWrapper提供一個很簡潔的方法來生成一個專案。它包含一些指令碼和一些庫以供啟動構建執行緒。詳情請見 https://docs.gradle.org/2.14.1/userguide/gradle_wrapper.html
下面是一個典型的 build.gradle 指令碼
buildscript {
repositories {
jcenter()
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'
jar {
baseName = 'myproject'
version = '0.0.1-SNAPSHOT'
}
repositories {
jcenter()
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")
}
10.2 安裝 SpringBootCLI 工具
SpringBootCLI是一個命令列工具,使用該工具可以快速體驗Spring的原型,它允許你執行 Groovy 指令碼,意味著你可以使用java相似的語法
你工作時無需使用 SpringBootCLI ,不過它定義了一種新的快速構建Spring專案的方法
10.2.1 安裝手冊
你可以從下面兩個分支下載 Sping-boot-cli
下載完成後,就可以按照壓縮包中的 INSTALL.txt 中的步驟進行安裝。
10.2.2 安裝 SDKMAN!
SDKMAN! (The Software Development Kit Manager) 可以用來管理多個 不同的 SDK,包括 Groovy 和 SpringBootCLI.可以從 sdkman.io 進行下載,然後執行下面的命令進行安裝
$ 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 的例項,它指向你編譯的位置,這樣每次重新編譯SpringBoot,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,那麼你執行如下命令就可以安裝SpringBootCLI:
$ brew tap pivotal/tap
$ brew install springboot
Homebrew就會把 spring 安裝到 usr/local/bin
如果你看不到這樣的提示,可能是你的brew不夠新,執行
brew update
進行更新,重試一下就好
10.2.4 MacPorts安裝
如果你正在使用mac,並且在使用 MacPorts,你只需要執行:
$ sudo port install spring-boot-cli
10.2.5 命令列自動補全
SpringBootCLI 為 BASH 和 zsh shells提供有自動補全功能。你可以在任何 shell中使用,或者把放在個人或者系統自動補全字典裡。在Debian系統裡,system-wide scripts(這個我不太知道是什麼意思)在 /shell-completion/bash
,這裡的指令碼在新的shelli啟動時都會執行。如果想手動執行,可以使用 SDKMAN!
$ . ~/.sdkman/candidates/springboot/current/shell-completion/bash/spring
$ spring <HIT TAB HERE>
grab help jar run test version
如果你在使用Homebrew 或者 MacPorts,那麼SpringBootCLI就會自動和Shell繫結。
10.2.6 一個SpringCLI的例子
下面是一個非常簡單的Web專案,你可用它來測試是否安裝成功。建立一個名稱為 app.groovy 的檔案:
@RestController
class ThisWillActuallyRun {
@RequestMapping("/")
String home() {
"Hello World!"
}
}
然後通過shell執行:
$ spring run app.groovy
第一次執行可能會慢一點,因為需要下載相關的依賴庫,下次就快了
在瀏覽器中 輸入 localhost:8080 你就可以看到:
Hello World!
10.3 從早期版本升級
如果你想從早期版本進行升級,請檢視 project wiki 中的 “release notes”.你將在那裡看到相關的升級指南
如果你想升級早期的 CLI工具,可以使用上面的包管理工具(比如:brew upgrade
)。如果是手動安裝的,請參照 指南 進行升級,記得更改環境變數。
11.開發第一個SpringBoot專案
讓我們通過一個簡單的 “hello world” 專案來看看 SpringBoot的一些動人的特點。我們將使用Maven來構建,因為大多數IDE都支援Maven。
在開始之前,請開啟一個終端,確保我們有正確的Java和Maven版本
$ 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.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>
然後執行 mvn package ,可以忽略”jar will be empty - no content was marked for inclusion!”的提示
此時你可以把它匯入你的常用IDE中。為了簡單,我們還用文字編輯器
11.2 新增classpath依賴
SpringBoot提供有許多的 “Starters” 來使構建變得簡單。我們的例子已經在POM的 parent 中使用了
spring-boot-starter-parent 。這個 spring-boot-starter-parent 是一個特殊的 starter 提供有maven的預設配置。它也提供有 dependency-management 模組 來省略 version 標籤
其他的 “starters” 也提供有一些依賴以供你開發特殊的程式是使用。因為我們在開發一個 web專案,所有我們需要新增上 spring-boot-starter-web 依賴。但是在這之前,讓我們看看現在已經擁有的依賴
$ mvn dependency:tree
[INFO] com.example:myproject:jar:0.0.1-SNAPSHOT
mvn dependency:tree 命令打印出了當前的專案依賴。你可以看到spring-boot-starter-parent 沒有提供其他依賴。我們開啟pom.xml並在 parent 塊下新增 spring-boot-starter-web 依賴:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
如果你再執行mvn dependency:tree
,就可以看到專案多了很多依賴,包括tomcat伺服器和SpringBoot自身的依賴。
11.3寫程式碼
為了完成我們的專案,我們還需要建立一個java file。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 註釋
我們例子中的第一個註釋是 @RestController。這個註釋在Spring中有特殊的涵義,意味著這是一個控制器,因此Spring會用它來處理web請求。
@RequestMapping 這個註釋提供有路由資訊。它告訴Spring 凡是請求路徑為 “/”的Http請求都應該由 home 方法來處理。同時這個註釋也告訴Spring 直接渲染結果的 string 給呼叫者。
@RestController和@RequestMapping是SpringMVC中的註釋。可以通過 MVC section來了解更多資訊
11.3.2 @EnableAutoConfiguration 註釋
第二個類級別的註釋是 @EnableAutoConfiguration
。這個註釋告訴SpringBoot去猜測你想如何配置Spring,主要根據你新增的jar包。因為 spring-boot-starter-web
新增有tomcat和SpringMVC,所以SpringBoot會認為你在開發一個web專案,並以此進行配置。
Starters and Auto-Configuration
Auto-Configuration設計用來更好的和 "Starters" 協同工作。不過這兩個概念並不直接相連。你可以自由選擇jar包依賴,並且spring-boot仍然會很好的自動配置你的專案。
11.3.3 “main” 方法
最後的部分是應用的main方法。這是標準的java程式入口方法。我們的主方法委託給SpringBoot的SpringApplication類的run方法。SpringApplication會啟動我們的程式,啟動自動配置的tomcat。我們需要把Example.class作為引數傳遞給SpringApplication。
11.4 執行例項
這時候我們的程式就可以工作了。因為我們配置了 spring-boot-starter-parent POM,我們就可以執行我們的程式了。在控制檯輸入 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)
此時我們就可以在瀏覽器中輸入 localhost:8080 看到相關輸出:
Hello World!
可以通過 ctrl+c 實現優雅退出程式
11.5 生成可執行jar檔案
最後讓我們通過生成可執行jar包來結束例子。可執行jar包中包含執行所需的所有類和依賴。
可執行jar包和java
java 本身沒有提供一個標準的方法生成可執行jar。這會在我們分發應用時造成問題。
為了解決這個問題,許多開發者使用 “uber” jars。“uber” jars只是把生成的類簡單的打成一個壓縮包。這樣的問題是沒法看到程式中應用了哪些類。這樣還有一個問題,就是多個相同的檔名的檔案(內容不同)被使用了
SpringBoot採用不同的方法允許你直接打包
為了建立一個可執行的 jar 包,我們需要在 pom檔案中新增 spring-boot-maven-plugin。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
spring-boot-starter-parent POM 包含 配置 來繫結打包。如果你沒有使用給定的父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檔案。這個檔案大約10M。如果你想看檔案內部,你就可以使用 jar tvf:
$ jar tvf target/myproject-0.0.1-SNAPSHOT.jar
你也可以在target裡看到一個相對小很多的檔案,檔名為 myproject-0.0.1-SNAPSHOT.jar.original。這個原始檔案是由SpringBoot打包前,由maven建立的。
為了執行該應用,可以使用 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.接下來
本部分提供了一些SpringBoot的基礎知識,也帶領你開始寫自己的程式。如果你是一個任務驅動型的開發者,你也許想跳到 http://spring.io 看看”Spring 能夠做什麼的問題 “’ 我們也提供有 SpringBoot How-to 的參考文件
另外,接下來的步驟是閱讀 第三部分 使用 SpringBoot.如果你實在沒有耐心,你也可以調到前面閱讀 Spring特點一章。