Spring Boot 基礎:使用 Spring Boot 編寫能直接運行的 Spring 應用程序

Spring Boot 基礎:使用 Spring Boot 編寫能直接運行的 Spring 應用程序

Spring Boot 是一個輕量級框架,能夠完成基於 Spring 的應用程序的大部分配置工做。在本教程中,將學習如何使用 Spring Boot 的 starter、特性和可執行 JAR 文件結構,快速建立能直接運行的基於 Spring 的應用程序。html

簡單介紹 Spring Boot 後,我將引導您設置並運行兩個 Spring Boot 應用程序:一個簡單的 「Hello, World」 應用程序和一個稍微複雜一點的 Spring MVC RESTful Web 服務應用程序。請注意,我在應用程序示例中使用的是 Spring Boot V1.5.2。推薦您使用 V1.5.2 或更高版本,但這些示例應適用於任何高於 1.5 的版本。java

前提條件

要充分掌握教程內容,您應該能熟練使用 Java™ Development Kit V8 (JDK 8)。還須要熟悉 Eclipse IDE、Maven 和 Git。git

要順利學習本教程,請確保安裝瞭如下軟件:github

深刻介紹教程以前,我想簡單介紹一下 Spring Boot。web

Spring Boot 是什麼?

Spring Boot 的目的是提供一組工具,以便快速構建容易配置的 Spring 應用程序。spring

問題:Spring 很難配置!

若是您編寫過基於 Spring 的應用程序,就會知道只是完成 「Hello, World」 就須要大量配置工做。這不是一件壞事:Spring 是一個優雅的框架集合,須要當心協調配置才能正確工做。但這種優雅的代價是配置變得很複雜(別跟我提 XML)。數據庫

解決方案:Spring Boot

開始介紹 Spring Boot。Spring Boot 網站 對它的介紹比個人簡介更爲簡潔:apache

「Spring Boot 使您能輕鬆地建立獨立的、生產級的、基於 Spring 且能直接運行的應用程序。咱們對 Spring 平臺和第三方庫有本身的見解,因此您從一開始只會遇到極少的麻煩。」瀏覽器

基本上講,這意味着您只需極少的配置,就能夠快速得到一個正常運行的 Spring 應用程序。這些極少的配置採用了註釋的形式,因此沒有 XML。tomcat

這一切聽起來很不錯,對吧?但 Spring Boot 究竟是怎麼工做的?

首先,它頗有主見

Spring Boot 擁有觀點。換句話說,Spring Boot 擁有合理的默認值,因此您可使用這些經常使用值快速構建應用程序。

例如,Tomcat 是一個很是流行的 Web 容器。默認狀況下,Spring Boot Web 應用程序使用了一個嵌入式 Tomcat 容器。

其次,它能夠自定義

若是沒法改變其想法,具備主見的框架就不是很好的框架。您能夠根據本身的喜愛輕鬆地自定義 Spring Boot 應用程序,不管是在進行初始配置時仍是在開發週期的後期階段。

例如,若是喜歡 Maven,能夠輕鬆地在 POM 文件中更改 <dependency> 來替換 Spring Boot 默認值。教程後面會這麼作。

開始使用 Spring Boot

Starter

starter 是 Spring Boot 的一個重要組成部分,用於限制您須要執行的手動配置依賴項數量。要想有效地使用 Spring Boot,您應該瞭解 starter。

starter 其實是一組依賴項(好比 Maven POM),這些依賴項是 starter 所表示的應用程序類型所獨有的。

全部 starter 都使用如下命名約定:spring-boot-starter-XYZ,其中 XYZ 是想要構建的應用程序類型。如下是一些流行的 Spring Boot starter:

  • spring-boot-starter-web 用於構建 RESTful Web 服務,它使用 Spring MVC 和 Tomcat 做爲嵌入式應用程序容器。
  • spring-boot-starter-jerseyspring-boot-starter-web 的一個替代,它使用 Apache Jersey 而不是 Spring MVC。
  • spring-boot-starter-jdbc 用於創建 JDBC 鏈接池。它基於 Tomcat 的 JDBC 鏈接池實現。

Spring Boot starter 參考頁面 還列出了其餘許多 starter。您能夠訪問該頁面來了解每一個 starter 的 POM 和依賴項。

自動配置

若是您容許的話,Spring Boot 會使用其 @EnableAutoConfiguration 註釋自動配置您的應用程序。自動配置基於類路徑中的 JAR 和定義 bean 的方式:

查看配置:使用 --debug 選項啓動您的 Spring Boot 應用程序,而後將向控制檯生成一個自動配置報告。

  • Spring Boot 使用您在 CLASSPATH 中指定的 JAR,造成一個有關如何配置某個自動行爲的觀點。例如,若是類路徑中有 H2 數據庫 JAR,並且您沒有配置任何其餘 DataSourcebean,您的應用程序會自動配置一個內存型數據庫。
  • Spring Boot 使用您定義 bean 的方式來肯定如何自動配置自身。例如,若是您爲 JPA bean 添加了 @Entity 註釋,Spring Boot 會自動配置 JPA,這樣您就不須要 persistence.xml文件。

Spring Boot über jar

Spring Boot 旨在幫助開發人員建立能直接運行的應用程序。爲實現該目的,它將應用程序及其依賴項包裝在一個可執行 JAR 中。要運行您的應用程序,能夠像這樣啓動 Java:

$ java -jar PATH_TO_EXECUTABLE_JAR/executableJar.jar

Spring Boot über JAR 不是一個新概念。由於 Java 沒有提供加載嵌套式 JAR 的標準方式,因此開發人員多年來一直使用 Apache Maven Shade 插件 等工具來構建 「shaded」 JAR。shaded JAR 僅包含來自應用程序的全部依賴 JAR 的 .class 文件。但隨着應用程序複雜性的增長和依賴項的增多,shaded JAR 可能遇到兩個問題:

  1. 名稱衝突,不一樣 JAR 中的兩個類採用了相同名稱。
  2. 依賴項版本問題,兩個 JAR 使用同一個依賴項的不一樣版本。

Spring Boot 解決這些問題的方法是定義一種 特殊的 JAR 文件佈局,其中的 JAR 自己嵌套在 über JAR 中。Spring 支持工具(例如 spring-boot-maven 插件)隨後會構建這個可執行的 über JAR,使其符合該佈局(不僅是像shaded JAR 同樣解包和從新打包 .class 文件)。運行這個可執行 JAR 時,Spring Boot 使用了一個特殊的類加載器來處理嵌套式 JAR 中的類。

編寫 Hello, World!

如今您已準備好開始直接使用 Spring Boot 了。本節中的示例基於一個名爲 HelloSpringBoot 的簡單應用程序。您能夠和我一塊兒練習這個應用程序開發示例,可是,若是想當即開始使用應用程序代碼,能夠從 Github 下載它。

讓咱們行動起來,建立一個新的 Maven 項目!

1
建立 Maven 項目

在 Eclipse 中,轉到 File > New Project 並選擇 Maven > Maven Project,如圖 1 所示。

圖 1. 選擇一個 Maven 項目

647e1a167a2f301a2d5b54660e3858ff.jpeg

單擊 Next,在隨後的對話框中(未給出)再次單擊 Next。

您會被要求選擇新 Maven 項目的架構類型。選擇 maven-archetype-quickstart,如圖 2 所示。

圖 2. 選擇 Maven quickstart 架構類型

52e3357abec28c4db7c9e9c265ee4957.jpeg

單擊 Next。

最後,輸入工件設置,如圖 3 所示。

圖 3. 選擇 Maven 工件設置

33ffd99b56dcea9bbecdb4a51491fb3b.jpeg

我爲 HelloSpringBoot 應用程序使用瞭如下設置:

  • Group Id:com.makotojava.learn
  • Artifact Id:HelloSpringBoot
  • Version:1.0-SNAPSHOT
  • Package:com.makotojava.learn.hellospringboot

單擊 Finish 建立該項目。

2
建立 POM

修改 New Project 嚮導建立的 POM,使其相似於清單 1。

清單 1. HelloSpringBoot 的 POM 文件

<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.makotojava.learn</groupId>
 <artifactId>HelloSpringBoot</artifactId>
 <version>1.0-SNAPSHOT</version>
 <packaging>jar</packaging>
 <name>HelloSpringBoot</name>
 <url>http://maven.apache.org</url>
 <parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>1.5.2.RELEASE</version>
 </parent>
 <dependencies>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 </dependencies>
 <properties>
 <java.version>1.8</java.version>
 </properties>
 <build>
 <plugins>
 <plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 </plugin>
 </plugins>
 </build></project>

請注意清單 1 中突出顯示的行:

第 10 至 14 行顯示了 <parent> 元素,它指定了 Spring Boot 父 POM,幷包含常見組件的定義。您不須要手動配置這些組件。

第 16 至 19 行顯示了 spring-boot-starter-web Spring Boot starter 上的 <dependency>。它們告訴 Spring Boot,該應用程序是 Web 應用程序。Spring Boot 會相應地造成本身的觀點。

第 25 至 30 行 告訴 Maven 使用 spring-boot-maven-plugin 插件生成該 Spring Boot 應用程序。

配置不是太多,對吧?請注意,這裏沒有 XML。咱們使用 Java 註釋完成剩餘配置。

進一步瞭解 Spring Boot 的觀點

在進一步介紹以前,我想再講講 Spring Boot 的觀點。換句話說,我認爲有必要解釋一下 Spring Boot 如何使用 spring-boot-starter-web 等 starter 來造成本身的配置觀點。

示例應用程序 HelloSpringBoot 使用了 Spring Boot 的 Web 應用程序 starter spring-boot-starter-web。基於這個 starter,Spring Boot 造成了該應用程序的如下觀點:

  • 使用 Tomcat 做爲嵌入式 Web 服務器容器
  • 使用 Hibernate 進行對象-關係映射 (ORM)
  • 使用 Apache Jackson 綁定 JSON
  • 使用 Spring MVC 做爲 REST 框架

咱們來說講主見!據 Spring Boot 辯解,這些是最流行的 Web 應用程序默認設置 — 至少我一直在使用它們。

可是還記得我說過 Spring Boot 能夠自定義嗎?若是您想使用不一樣的技術組合,能夠輕鬆地覆蓋 Spring Boot 的默認設置。

咱們接下來將演示一種簡單的自定義。

丟失 <parent>

若是您的 POM 中已有一個 <parent> 元素,或者若是不想使用它,該怎麼辦?Spring Boot 是否仍會正常運行?

是的,它會正常運行,但您須要作兩件事:

  1. 手動添加依賴項(包括版本)
  2. spring-boot-maven-plugin 添加一個配置代碼段,如清單 2 所示:清單 2. 在不使用 <parent> POM 元素時,指定 repackage 目標
<build>
 <plugins>
 <plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 <version>1.5.2.RELEASE</version>
 <executions>
 <execution>
 <goals>
 <goal>repackage</goal>
 </goals>
 </execution>
 </executions>
 </plugin>
 </plugins></build>

檢查依賴項:若是您須要查看使用的 Spring Boot starter 拉入了哪些依賴項,請訪問 Spring Boot starter 參考頁面

必定要注意,Maven 的許多優秀功能都是在 <parent> 元素中實現的,因此若是您有合理的理由不使用它,繼續操做時務必當心。確保向 spring-boot-maven-plugin 添加了一條 repackage 目標執行語句,這裏提供瞭解釋

該項目已配置和自定義。如今是時候構建可執行程序了。

3
構建可執行 JAR

要使用 Maven 構建可執行 JAR,有兩種選擇:

  1. 在 Eclipse 中運行 Maven 構建
  2. 從命令行運行 Maven 構建

我將介紹如何實現這兩種方法。

在 Eclipse 中構建

要在 Eclipse 中運行 Maven 構建,請右鍵單擊 POM 文件並選擇 Run As > Maven Build。在 Goals 文本字段中,輸入 cleanpackage,而後單擊 Run 按鈕。

圖 4. 在 Eclipse 中構建可執行 JAR

85ab952b9b8efc8de2c25ef06dc99db7.jpeg

您會在控制檯視圖中看到一條消息,代表成功實現了構建:

..[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 2.440 s[INFO] Finished at: 2017-04-16T10:17:21-05:00[INFO] Final Memory: 30M/331M[INFO] ------------------------------------------------------------------------

從命令行構建

要從命令行運行 Maven 構建,請打開 Mac 終端窗口或 Windows 命令提示,導航到 HelloSpringBoot 項目目錄,而後執行如下命令:

mvn clean package

您會在終端窗口或命令提示中看到一條消息,代表成功實現了構建。

$ cd HelloSpringBoot$ pwd/Users/sperry/home/HelloSpringBoot$ mvn clean package..[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 2.440 s[INFO] Finished at: 2017-04-16T10:17:21-05:00[INFO] Final Memory: 30M/331M[INFO] ------------------------------------------------------------------------$

如今您已準備好運行這個可執行 JAR 了。

4
運行可執行 JAR

要運行剛建立的可執行 JAR,請打開 Mac 終端窗口或 Windows 命令提示,導航到 HelloSpringBoot 項目文件夾,而後執行:

java -jar target/HelloSpringBoot-1.0-SNAPSHOT.jar

其中 target 是構建的默認輸出目錄。若是爲它配置了不一樣的目錄,請在上面的命令中進行相應的替換。

Spring Boot 的輸出包含一個文本式 「啓動屏幕」(第 2 至 7 行),以及其餘輸出,相似於下面的清單。我僅展現了部分行,以便讓您瞭解在運行該應用程序時應看到的內容:

$ java -jar target/HelloSpringBoot-1.0-SNAPSHOT.jar
 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
 '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.2.RELEASE)2017-04-15 17:46:12.919  INFO 20096 --- [           main] c.makotojava.learn.hellospringboot.App   : Starting App v1.0-SNAPSHOT on Ix.local with PID 20096 (/Users/sperry/home/projects/learn/HelloSpringBoot/target/HelloSpringBoot-1.0-SNAPSHOT.jar started by sperry in /Users/sperry/home/projects/learn/HelloSpringBoot)2017-04-15 17:46:12.924 DEBUG 20096 --- [           main] c.makotojava.learn.hellospringboot.App   : Running with Spring Boot v1.5.2.RELEASE, Spring v4.3.7.RELEASE..2017-04-15 17:46:15.221  INFO 20096 --- [           main] c.makotojava.learn.hellospringboot.App   : Started App in 17.677 seconds (JVM running for 18.555)

若是應用程序成功啓動,Spring Boot 輸出的最後一行會包含文字 「Started App」(第 13 行)。如今您已準備好體驗本身的應用程序了,咱們接下來就會來體驗它。

5
體驗該應用程序

能夠打開瀏覽器並訪問如下 URL,以便執行 HelloSpringBoot 的單一 REST 方法:

http://localhost:8080/hello

圖 5. 開始使用 Spring Boot!

3f85e3438f17aa8f82b6ea11c87ba5eb.jpeg

若是看到文本 「Hello, All your base are belong to us」(視頻遊戲 Zero Wing 的主頁),就會知道該應用程序在正常運行!

更改 Spring Boot 的觀點

Spring Boot 的觀點基於 POM 的內容,包括您在初步配置應用程序時指定的 Spring Boot starter。造成有關想要構建的應用程序類型的觀點後,Spring Boot 會提供一組 Maven 依賴項。圖 6 展現了 Spring Boot 在 Eclipse 中設置的一些 Maven 依賴項,它們基於 POM 內容以及爲 HelloSpringBoot 應用程序指定的 starter:

圖 6. HelloSpringBoot 的初始依賴項

f2c4d7f7d935fbd745e7d10b465445ff.jpeg

請注意,Tomcat 是默認的嵌入式 Web 服務器容器。如今咱們假設您不想使用 Tomcat,而是想使用 Jetty。只需更改 POM 中的<dependencies> 節(將清單 3 中第 5 至 15 行粘貼到 清單 1 中的第 19 行以前):

清單 3. 更改 POM 來使用 Jetty 代替 Tomcat

<dependencies>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 <exclusions>
 <exclusion>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-tomcat</artifactId>
 </exclusion>
 </exclusions>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-jetty</artifactId>
 </dependency></dependencies>

在下面能夠注意到,Maven 的 Tomcat 依賴項消失了(得益於清單 3 中的第 5 至 10 行),取而代之的是 Jetty 依賴項(第 12 至 15 行)。

圖 7. 自定義的 HelloSpringBoot 依賴項

05e43e67b00d89c0f572687326aa6f5d.jpeg

實際上,一張屏幕截圖沒法顯示全部 Jetty 依賴項,但它們都包含在這裏,並且 Tomcat 依賴項消失了。您能夠自行嘗試並查看結果!

建立複雜的應用程序。

簡單的示例雖然也能很好地展現 Spring Boot,但它能作的事情要多得多!在本節中,我將經過一個 Spring MVC RESTful Web 應用程序,介紹如何讓 Spring Boot 充分發揮做用。要作的第一件事是設置新示例應用程序 SpringBootDemo。

SpringBootDemo

SpringBootDemo 是一個 Spring Boot 包裝器,它包裝了一個名爲 oDoT 的基於 Spring 的簡單 POJO 應用程序。(ToDo 中的反向排列……明白了嗎?)它的目的是練習開發比簡單 Hello, World 更復雜的應用程序的過程。您還會了解如何使用 Spring Boot 包裝一個現有的應用程序。

要設置和運行 SpringBootDemo,須要作 3 件事:

  1. 從 GitHub 獲取代碼。
  2. 構建並運行可執行 JAR。
  3. 經過 SoapUI 訪問該應用程序。

我建立了一個視頻來幫助引導您完成此過程的每一步。如今能夠啓動該視頻了。

SpringBootDemo 演練、

點擊查看視頻

73b435762ac43a925716bc9676187c8b.jpeg

獲取代碼

首先,您須要從相應的 GitHub 存儲庫克隆兩個項目。第一個項目名爲 odotCore,包含應用程序的業務邏輯,該項目編寫爲一個基於 Spring 的 POJO 應用程序。另外一個項目名爲 SpringBootDemo,是一個圍繞 odotCore 的 Spring Boot 應用程序包裝器。

要克隆 odotCore 存儲庫,請打開一個 Mac 終端窗口或 Windows 命令提示,導航到您想放入該代碼的根目錄,而後執行如下命令:

git clone https://github.com/makotogo/odotCore

要克隆 SpringBootDemo 存儲庫,可執行如下命令:

git clone https://github.com/makotogo/SpringBootDemo

請注意,兩個項目被直接放在應用程序的根目錄下。接下來將代碼導入工做區中。

2
將代碼導入 Eclipse 中

轉到 File > Import... 並選擇 Maven > Existing Maven Projects

在下一個對話框中,使用 Browse 按鈕導航到根目錄。上一步中克隆的兩個項目都應出如今對話框中,以下圖所示:

圖 8. 導入 Maven 項目

cc09ab7883be297deda1588adf44337c.jpeg

單擊 Finish 將這些項目導入 Eclipse 工做區中。接下來將構建可執行 JAR。

3
構建可執行 JAR

要構建 SpringBootDemo,還須要構建 odotCore 和 SpringBootDemo 項目。能夠從命令行構建這些項目,就像在 HelloSpringBoot 應用程序中所操做的那樣。在本例中,我將指導您使用 Eclipse。

在 Eclipse 中,右鍵單擊 odotCore 項目。選擇 Run As > Maven Build,指定 cleaninstall 目標。install 目標會將odotCore-1.0-SNAPSHOT.jar JAR 文件安裝到本地 Maven 存儲庫中。在運行 SpringBootDemo Maven 構建時,可從這裏以依賴項形式拉入它。

odotCore Maven 構建成功運行後,右鍵單擊 SpringBootDemo 項目,選擇 Run As > Maven Build,而後指定 cleanpackage 目標。

備註:odotCore 項目包含多個單元測試。儘管我從不建議跳過單元測試,但您能夠設置在 Eclipse 中構建 odotCore 項目的運行配置,讓其跳過這些測試(Run Configuration 對話框上有一個對應的複選框)。

成功構建 SpringBootDemo 後,能夠從命令行運行 SpringBootDemo über JAR。

4
運行可執行 JAR

從 Mac 終端窗口或 Windows 命令提示中導航到 SpringBootDemo 目錄。假設構建輸出目錄名爲 target(這是默認設置),執行如下命令:

java -jar target/SpringBootDemo-1.0-SNAPSHOT.jar

如今靜候 Spring Boot 運行該應用程序。當看到文本 「App Started」 時,就能夠體驗該應用程序了。

5
體驗該應用程序

做爲一次快速冒煙測試,爲了確保您的應用程序正常運行,可打開一個瀏覽器窗口並輸入如下 URL:

http://localhost:8080/CategoryRestService/FindAll

這會訪問 CategoryRestServiceFindAll 方法,以 JSON 格式返回數據庫中的全部 Category 對象。

圖 9. 經過瀏覽器訪問 SpringBootDemo

91d217711cd2fdd1fa764b7f334f5b17.jpeg

也能夠經過 SoapUI 體驗該應用程序。我不會演示該如何作,但本教程的視頻中介紹了該過程。

表 1 給出了 SpringBootDemo 的每一個服務中的服務和方法。

表 1. oDoT (SpringBootDemo) 服務和方法

a10914114cd8332b332275b41502359b.jpeg172fe5c629b7e6fc4ed35ea2e64f8b20.jpeg

建議研究該代碼,試用它,以便更深刻地瞭解 Spring Boot 的工做原理。

結束語

本教程介紹了 Spring Boot 解決的問題,並簡要介紹了它的工做原理。而後我演練了設置和運行一個簡單的 Spring Boot 應用程序 HelloSpringBoot 的過程。最後展現瞭如何使用 Spring Boot 構建和體驗 Spring MVC RESTful Web 服務應用程序。

那麼您接下來會怎麼作?

原做者:J Steven Perry
原文連接: Spring Boot 基礎 - IBM Developer 中國 (原 developerWorks)
原出處:IBM Developer

f1f7e4a02b61e5e2113e17ddbc714290.jpeg

相關文章
相關標籤/搜索