1. 程式人生 > >Spring學習系列

Spring學習系列

Spring學習系列 一

Getting Started

Spring Boot可以和經典的Java開發工具或者命令列工具一起使用,但是無論如何需要有JDK1.8以上的支援。
在開始之前,需要檢查一下你的JDK版本

// check JDK version
$ java -version

1.安裝教程

你可以像使用其他的標準的Java庫一樣來使用Spring Boot,只需要將spring-boot-*.jar檔案適當的包含到你的classpath即可。Spring Boot不需要任何特殊的整合工具,所以你可以使用任何你喜歡的編輯器或者IDE.並且,對於一個Spring Boot應用來說,和其他的Java應用沒有什麼不同。你可以像除錯其他的Java應用程式一樣來除錯你的Spring Boot應用程式。
雖然你完全可以將Spring Boot的jar包拷貝到你的工程目錄然後使用,但我們強烈建議您使用支援依賴管理的構建工具,比如說Maven或者Gradle

JDK安裝

這裡就不說了,網上的教程一搜一大把,注意版本要在1.8以上

Maven安裝

Spring Boot支援Apache Maven3.3以上的版本,安裝指南可以參照這個連結
提示
如果你使用 OSX:

// Install maven on OSX
$ brew install maven

如果你使用 Ubuntu:

// Install maven on ubuntu
$ sudo apt-get install maven

注意檢查一下版本

// check maven version
$ mvn --version

注意:如果版本低於3.3,則需要手動安裝,和JDK安裝基本一樣,設定好環境變數就OK。

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.1.0.RELEASE</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>
</project>

提示
使用spring-boot-starter-parent是使用Spring Boot的很好的方式

2.安裝Spring Boot CLI

Spring Boot CLI(Command Line Interface)是一個你可以快速構建Spring應用的命令列介面i,它讓你可以執行Groovy指令碼。當然了,你也可以不使用Spring Boot CLI,但使用Spring Boot CLI絕對是構建Spring應用的最快方式。

手動安裝

下載連結
下載完成之後解壓縮,在bin目錄下有可執行檔案(win下有.bat檔案)
測試(Linux下)

// test spring Boot CLI
$ ./spring --version

windows下

// test spring Boot CLI
$ .\spring.bat --version

命令列介面測試

首先建立一個名叫app.groovy的檔案,內容如下:

@RestController
class ThisWillActuallyRun {

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

}

從命令列執行(Linux)

$ spring run app.groovy

Windows下

$ .\spring.bat run app.groovy

注意:第一次執行需要下載依賴包,需要等待幾分鐘,然後開啟瀏覽器,在位址列輸入 localhost:8080 即可看到如下輸出:

Hello World!

3.建立你的第一個Spring Boot應用

開始之前首先確認一下我們的JDK和Maven都安裝正確了,因為下面將會用到它們。

3.1建立一個專案

新建一個資料夾,名為test1,所有的專案檔案將存放在這個資料夾裡面

3.2建立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.1.0.RELEASE</version>
	</parent>

	<!-- Additional lines to be added here... -->

</project>

在test1資料夾下,執行

$ mvn package

Spring Boot提供了很多的Starters來讓你新增jar包到你的calsspath。我們的例程在POM檔案裡面的parent段裡面使用了spring-boot-starter-parentspring-boot-starter-parent是一個特殊的starter,可以提供很多的預設的Maven設定。也提供了一個dependency-management段,這樣你可以省略version標籤。
當你開發某一特定型別的應用的我時候,其他的starter提供了你可能需要的依賴。因為我們是在開發一個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 web server和Spring Boot自己。

3.3 編寫程式碼

在test1資料夾下建立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) throws Exception {
		SpringApplication.run(Example.class, args);
	}

}

儘管這裡的程式碼不多,但是後面卻有很多東西在執行。我們將在下面進行分析。

3.3.1 @RestController 和 @RequestMapping 註解

我們的Example類中的第一個註解是@RestController.這是一個被稱為原型的註解。作用是告訴閱讀程式碼的人,這個類扮演著一個特殊的角色。在本例中,我們的類是一個web @Controller,所以再有web請求的時候,Spring就會考慮到它。

我們的 @RequestMapping註解提供了一個路由的資訊。它告訴Spring,任何帶有/的HTTP請求都應該被對映到home方法。@RestController註解告訴Spring將結果直接返回給呼叫者。

注意:這裡的 @RestControllerRequestMapping註解都是Spring MVC的註解。

3.3.2 @EnableAutoConfiguration 註解

第二個類級別的註解是@EnableAutoConfiguration。這個註解告訴Spring Boot,基於你新增的jar包的依賴,去“猜測”你將如何配置你的Spring。由於spring-boot-starter-web添加了Tomcat和SpringMVC,自動配置將認為你是在開發一個web應用並將為之設定Spring.

Starters 和Auto-configuration
Auto-configuration被用來和Starters更好的工作,但是這兩個概念並不是直接聯絡在一起的。你可以選擇Starter之外的jar包依賴.Spring-Boot任然會竭盡全力為你繳納自動配置好你的應用。

3.3.3 main方法

我們的應用的最後一個部分就是main方法。我們的main方法通過呼叫run方法來呼叫Spring Boot的SpringApplication.SpringApplication將會啟動我們的應用,啟動Spring,Spring會啟動自動配置好的Tomcat。我們需要將Example.class作為一個引數傳遞給run方法,告訴SpringApplication哪一個是基本的Spring單元。args也傳遞過去以曝露任何需要的命令列引數。

3.4執行例程

$ mvn spring-boot:run

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v2.1.0.RELEASE)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.222 seconds (JVM running for 6.514)

開啟瀏覽器,訪問localhost:8080,將會開到如下輸出:

Hello World !

3.5建立一個可執行的jar包

在最後,我們將建立一個可以在生產環境中執行的jar包來結束例程。可執行jar包(有時候被稱為“fat jars”)是包含著編譯好的類和依賴的jar包的檔案集合。

				可執行jar包和Java

Java並不提供一個標準的方法來載入遞迴的jar包(本身包含jar包的jar包)。如果你需要一個自我包含的發行版的應用的話就有問題了。
為了解決這個問題,很多開發者使用“uber”jar包。“uber”jar包指的是將應用依賴的所有的類都打包到一個集合。這種方法的問題就在於很難看清楚你的應用裡賣弄有哪些類庫。如果使用了同一個類名(內容不同)會帶來問題。
Spring Boot採取了不同的方式,讓你可以直接遞迴使用你都jar包。

為了建立一個可執行的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-parentPOM已經包含了<executions>配置來繫結repackage目標。如果你不使用parent 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.1.0.RELEASE:repackage (default) @ myproject ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

此時,你會發現你的test1/target資料夾下,會出現一個myproject-0.0.1-SNAPSHOT.jar,十多MB大小,想看裡面的內容,使用:

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

在target資料夾下,可以看到一個小得多的檔案 myproject-0.0.1-SNAPSHOT.jar.original
這是Spring重新打包之前maven之前建立的。
執行這個應用,需要使用java -jar命令:

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

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v2.1.0.RELEASE)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.536 seconds (JVM running for 2.864)

參考:
[1]https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#boot-documentation