11 構建一個簡單的Spring Boot項目 這個章節描述如何通過Spring Boot構建一個“Hello Word”web應用,側重介紹Spring Boot的一些重要功能。因為大多數的開發工具都支持Maven,所以我們使用它來構建這個應用。 網站 "spring.io" 包含了許多如何開始使 ...
11 構建一個簡單的Spring Boot項目
這個章節描述如何通過Spring Boot構建一個“Hello Word”web應用,側重介紹Spring Boot的一些重要功能。因為大多數的開發工具都支持Maven,所以我們使用它來構建這個應用。
網站 spring.io 包含了許多如何開始使用Spring Boot的指南。如果您需要解決具體的問題,可以先去這裡看看。你可以跳過以下的步驟,通過 start.spring.io 網站來構建項目。這樣做的話,你就可以直接編寫代碼啦。如果需要瞭解更多詳情,點擊 Spring Initializr documentation
在我們開始之前,先打開命令終端,運行以下命令,確認Java的版本和Maven的安裝。
個人備註:Spring Boot在2.0以下,1.21以上包含1.21版本,jdk版本要求1.7;
2.0以上包含2.0 jdk版本要求1.8+
$ java -version
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)
$ mvn -v
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-17T14:33:14-04:00)
Maven home: /usr/local/Cellar/maven/3.3.9/libexec
Java version: 1.8.0_102, 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 https://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.1.8.RELEASE</version>
</parent>
<!-- Additional lines to be added here... -->
<!-- 在此處添加其他行... -->
</project>
通過以上的操作,應該可以正常將項目構建好,然後你可以通過運行mvn package命令來打包項目,這時候你可以忽略“jar will be empty - no content was marked for inclusion!”警告。
做完以上的步驟,你就可以將項目導入到類似IDEA的開發工具中。因為這個項目比較簡單,我們繼續用簡單的text編輯器來構建項目,這樣來的更為方便。
11.2 添加項目依賴
Spring Boot提交了許多“啟動器”讓你選擇添加到項目依賴中。我們的示例已經在POM的部分章節中使用了spring-boot-starter-parent。它是一種特殊的啟動器,提供了預設的Maven配置。它還提供了dependency-management部分,讓你可以不用指定依賴包版本引用依賴的jar包。
其他的“啟動器”提供了一些特殊開發需要的依賴。比如當我們開發web應用的時候,我們添加spring-boot-starter-web依賴。在此之前,我們先看看我們現在有哪些依賴,運行一下命令。
$ mvn dependency:tree
[INFO] com.example:myproject:jar:0.0.1-SNAPSHOT
mvn dependency:tree這個命令會以樹形結構展示你項目的依賴。你可以看到spring-boot-starter-parent沒有為自己提供任何依賴。為了讓web應用可以正常運行,現在在你的pom.xml文件中添加“spring-boot-starter-web”依賴,具體如下所示:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
如果現在你再運行一次mvn dependency:tree命令,你會看到多出很多其他的依賴包,比如Tomcat web Server和Spring Boot。
11.3 編寫代碼
為了讓完成我們的web應用,我們編寫一個簡單的Java類。Maven預設編譯src/main/java下的代碼,所以你需要在這個路徑下新建Example.java類,然後添加如下代碼:
import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
public class Example {
@RequestMapping("/")
String home() {
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(Example.class, args);
}
}
儘管這裡的代碼量沒有很多,但是做了的事情卻不少,下麵來具體介紹下這裡面的重要部分。
11.3.1 註解 @RestController 和註解 @RequestMapping
在上面示例代碼Example.java類中,@RestController是我們使用的第一個註解。這個註解被稱之為構造型註解。對於我們來說,它暗示著這個類在Spring Boot中具有特殊的意義,即,這個類是web控制器,用來捕捉進來的請求。
@RequestMapping註解提供了路由信息,它告訴Spring任何HTTP以“/”路徑的請求都將被映射到home方法中。@RestController還告訴了Spring將結果直接以字元串的方式返回到請求方。
@RequestMapping 和 @RestController註解是Spring MVC的註解,跟Spring Boot沒有具體的關係,如果想要瞭解更多,可以看MVC章節的相關文檔
11.3.2 @EnableAutoConfiguration註解
第二個使用在類上面的註釋是 @EnableAutoConfiguration,這個註解告訴Spring通過你在應用添加的依賴包來猜測你對Spring的配置(其實用猜測不是特別的準確,就是通過已經有的jar包,提供預設的配置)。因為spring-boot-starter-web已經添加了Tomcat和Spring MVC,自動化配置就會假設你在開發Spring Web項目,從而會依照Web開發為你做相應的配置。
啟動器和自動化配置
自動化配置設計的宗旨是同啟動器協同工作,但是它們之間沒有直接的聯繫。也就說,你可以自由的選擇啟動器以外的jar包,Spring Boot依然會儘可能為你的應用做自動化配置。
11.3.3 main方法
應用最後的部分就是這個“main”方法,這隻是一個遵循了Java標準的程式入口方法。通過調用run方法,我們的“main”方法委托給了Spring Boot的SpringApplication類,SpringApplication再引導我們的應用,啟動Spring,啟動自動配置的Tomcat。我們需要將Example.class作為參數傳遞給SpringApplication,以便它知道哪部分才是Spring的重要組件。args數組也可以通過命令行參數傳遞。
11.4 啟動Example項目
到了這裡,你的應用應該可以正常啟動運行了。因為你已經添加了在POM里引用了spring-boot-starter-parent,你還有一個有效的程式運行入口。在文件的根目錄運行終端,輸入mvn spring-boot:run啟動你的項目,你應該會看到類似於下麵的輸出:
$ mvn spring-boot:run
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.8.RELEASE)
....... . . .
....... . . . (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(有時候被稱之為“fat jars”,實在不知道怎麼翻譯這個詞,胖夾?汗)將會包含已編譯的class文件和運行時所需要的所有依賴jar。
Executable jars and Java
Java沒有提供嵌套jar的標準方法,這可能會導致你在分發應用的時候出現問題。
為瞭解決這個問題,許多開發人員使用“uber”jars,一個uber jar可以將class和應用所有的依賴打包成單個完成物,一般就是一個jar。這種方式的問題在於,打包完成後,你就很難看到其中包含了哪些依賴包了。還有種情況就是如果兩個包名是一樣的,但內容卻不一樣,這也可能引發問題。
Spring Boot提供了另一種方式解決這個問題,具體查看different approach
為了完成一個完整的jar包,我們需要在應用pom文件中添加如下的代碼:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
spring-boot-starter-parent已經在POM中綁定了打包目標,如果你沒有使用這個,你需要自己申明使用。
保存你的pom.xml文件,運行一下命令:
$ 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.1.8.RELEASE:repackage (default) @ myproject ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
如果你打開target目錄你將會看到myproject-0.0.1-SNAPSHOT.jar,這個jar包大概在10M左右的樣子。如果你想看到裡面的內容,可以運行jar tvf命令,具體如下:
$ jar tvf target/myproject-0.0.1-SNAPSHOT.jar
運行完後,你將會在target目錄中看到一個名為myproject-0.0.1-SNAPSHOT.jar.original的文件,這是Maven在打包Spring Boot項目原始的文件。
運行項目,使用java -jar命令,具體如下:
$ java -jar target/myproject-0.0.1-SNAPSHOT.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.8.RELEASE)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.536 seconds (JVM running for 2.864)
跟上面一樣,關閉應用使用Ctrl + C命令