0. Spring Boot 2.x 入门学习指南

I. Spring Boot 文档

当前版本:2.1.2.RELEASE

如果你刚开始学习Spring Boot 或者Spring,那么应该从这篇博文开始阅读。
它会回答你 是什么?怎么做?为什么?这些基础性问题。它包含了Spring Boot的介绍,安装说明,然后会带你开始自己亲手创建一个Spring Boot 应用程序,顺便讲解一些用法规则。

1. 关于这个文档

Spring Boot 参考文档有三种格式:
HTML
PDF
EPUB
这三个文档的更新地址:https://docs.spring.io/spring-boot/docs/current/reference/

HTML 格式是在线英文文档,PDF 文件格式,EPUB电子书阅读格式。

2. 获取帮助

如果对Spring Boot 有疑惑,我们很乐意帮助你

  1. How-to documents 这一章节讲解大多数常见的问题
  2. 学习Spring 基础知识,Spring Boot 构建在许多Spring的项目之上。如果你刚开始学Spring ,那么尝试根据这个指南学习 https://spring.io/guides
  3. 使用Spring Boot 标签,在 https://stackoverflow.com/ 提问题
  4. 在 GitHub 上提Bug https://github.com/spring-projects/spring-boot/issues

Spring Boot 的一切都是开源的包括这个文档。

3. 入门

如果你刚开始学习Spring Boot 或者 Spring ,那么跟我一起来学习吧

3.1 Spring Boot 介绍

Spring Boot可以轻松创建可以独立运行,生产级基于Spring的应用程序。 大多数Spring
Boot应用程序只需要很少的Spring配置。 我们可以使用Spring Boot创建能用java -jar 命令运行的Java 应用程序,
也能创建传统的war包部署启动的Java应用程序 官方提供了一套 spring scripts(Spring 脚本),后面我们会详解。

Spring Boot 目标:

  • 让所有的Spring 开发变得更快,使用更广泛
  • 开箱即用,即提供了很多常用的默认配置。
  • 提供非常强大的功能支持,比如嵌入式Web容器,安全性,运行状态检测等。
  • 争取尽可能不需要或者少地使用 XML 和代码配置

3.2 系统要求

Spring Boot 2.1.2.RELEASE需要Java 8,并且与Java 11兼容。
还需要Spring Framework 5.1.4.RELEASE或更高版本。

编译工具 版本
Maven 3.3+
Gradle 4.4+

Spring boot 支持下面内嵌的Servlet 容器

名字 Servlet 版本
Tomcat 9.0 4.0
Jetty 9.4 3.1
Undertow 2.0 4.0

你也可以部署在任何兼容 Servlet 3.1+ 的Servlet 容器中。

3.3 安装 Spring Boot

Spring Boot 可以像经典的Java 应用程序一样通过Java -jar *.jar 的方式执行

3.3.1 安装JDK 或者JRE

以下任选其一即可:

配置环境变量:

JAVA_HOME
C:\Users\fairy\apps\jdk\jdk1.8

新建CLASSPATH环境变量:

CLASSPATH
.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\jre\lib\rt.jar;

PATH 中追加

%JAVA_HOME%\bin\

安装完成后验证安装输入命令:

java -version

安装成功回显如下:
0. Spring Boot 2.x 入门学习指南

注意:
不知道是不是如今的win10版本升级问题,javac命令回显和之前不一样了。
但是不影响正常使用,只需要用java -version验证即可0. Spring Boot 2.x 入门学习指南

3.3.2 Maven安装

Spring Boot 兼容Maven 3.3 以上版本,如果没有安装,可以去官网进行安装配置 https://maven.apache.org/

一些其他操作系统比如Mac OS 系统可能需要包管理器安装:
brew install maven
Ubuntu 使用命令
sudo apt-get install maven
关于Maven的详细安装配置介绍,参考我的阿里云博文:
版本依赖管理之 Maven 修炼手册

验证Maven安装

mvn -v

安装成功如下所示:
0. Spring Boot 2.x 入门学习指南

Spring Boot 依赖使用org.springframework.boot 作为groupId
spring-boot-starter-parent 作为artifactId Spring Boot
也提供了很多可选的插件来创建可执行的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.2.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的一个很好的方式,但是可能不适用所有场景。如果不喜欢这个默认的设置也可以参考后面的文章,使用13.2.2 Spring Boot 没有Parent POM

3.3.3 Gradle 安装

Spring Boot 兼容Gradle 4.4 +,如果没有安装可以去Gradle官网下载
这种方式目前还不太常用,所以不做太多详解。

3.3.4 安装Spring Boot CLI

Spring Boot CLI (Command Line Interface) 是一个命令行工具,使用的是Groovy脚本,这个也不是必要的,但它绝对是启动Spring应用程序最快的方法。

手动安装

spring-boot-cli-2.1.2.RELEASE-bin.zip
spring-boot-cli-2.1.2.RELEASE-bin.tar.gz
Spring Boot CLI 需要Java JDK v1.8

配置下环境变量

新建环境变量

SPRING_HOME
安装目录

追加到Path变量

%SPRING_HOME%\bin
验证安装:
spring --version 

Spring CLI 案例使用

我们需要创建一个app.groovy
然后Controller 配置如下

@RestController
class ThisWillActuallyRun {

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

运行命令

spring run app.groovy

打开http://localhost:8080 网址可以看到输出

Hello World!

Spring Boot 升级到2.x 说明

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide
https://github.com/spring-projects/spring-boot/wiki
当升级到新版本,以前的一些属性值可能已经被重命名或者被移除掉了。
关于这个问题,Spring Boot 提供了一个启动时分析应用程序环境和打印日志的方法,还可以在运行时临时迁移属性。
要想启用这个功能,添加这个依赖即可

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-properties-migrator</artifactId>
	<scope>runtime</scope>
</dependency>

添加到环境后期的属性(例如使用时 @PropertySource)将不会被考虑在内。
完成迁移后,请确保从项目的依赖项中删除此模块
要升级现有CLI安装,使用包管理器命令 brew upgrade 或者参考安装说明文档

3.4 开发我们的第一个Spring Boot 应用

接下来讲述如何开发一个简单的拥有Spring 核心功能的 “Hello World” Web应用程序.

我们使用Maven来构建这个项目,因为大多数IDE都支持它。

如果你要解决一个特殊的问题,可以参考这个文档 https://spring.io/guides
然后根据如下步骤快速创建项目:

  1. 快速构建我们的应用程序可以使用这个网址 https://start.spring.io/
  2. 选择Web 模块
  3. 点击下载
    0. Spring Boot 2.x 入门学习指南

3.4.1 环境安装检查

在开始之前我们需要打开命令行检查下安装的环境是否准备好

验证JDK(JRE)是否安装成功

 java -version

0. Spring Boot 2.x 入门学习指南

验证Maven 是否安装成功

输入如下命令

mvn -v

安装成功如下显示:
0. Spring Boot 2.x 入门学习指南

3.4.2 创建POM.xml

我们首先创建一个文件夹,比如叫做sample
然后在这个文件夹下创建一个pom.xml文件
0. Spring Boot 2.x 入门学习指南
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.2.RELEASE</version>
	</parent>

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

</project>

我们可以命令行进入这个文件夹,然后输入命令如下:

mvn package

执行成功如下所示:
0. Spring Boot 2.x 入门学习指南

3.4.3 添加ClassPath 依赖

Spring Boot 提供了很多“Starters”(启动器)来将批量的Jar包添加到你的ClassPath 中,我们刚才的pom.xml中已经使用了spring-boot-starter-parent

这个spring-boot-starter-parent提供了很多有用的Maven默认配置,比如
Dependency Management节点,这个用来统一项目中依赖版本,
version 标签来统一版本号
将Jar 包依赖添加到项目的Classpath中,在命令行下输入如下命令:

mvn dependency:tree

执行结果如下:
0. Spring Boot 2.x 入门学习指南
刚才使用命令后我们可以清楚地看到依赖中并没有web模块,但是由于我们要开发的是一个web应用,因此我们需要重新编辑我们的pom.xml 文件,添加如下依赖

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
    </dependencies>

完整的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.2.RELEASE</version>
	</parent>

	<!-- Additional lines to be added here... -->
	<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
    </dependencies>
</project>

3.4.4 写代码

要完成我们的应用程序,我们还需要新建一个java文件

创建src/main/src 文件夹和一个Example.java 文件

如下所示:
0. Spring Boot 2.x 入门学习指南
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);
	}

}

代码不是很多,接下来我们来讲解下这些代码。

3.4.4.1 @RestController 和@RequestMapping 注解

Exam的上方第一个注解@RestController
它为阅读代码的人提供了提示,表示我们的类是一个Web @Controller,所以Spring在处理传入的Web请求时会考虑它。

@RequestMapping 注解提供了路由信息,它告诉Spring 任何/ HTTP 请求都映射到home方法

@RestController注解告诉Spring使得到的字符串直接返回给调用者。

值得注意的是,@RestController 和@RequestMapping 注解都是Spring MVC 的注解,而不是Spring Boot 所特有的。

3.4.4.2 @EnableAutoConfiguration 注解

第二个类级别的注解是@EnableAutoConfiguration ,这个注解告诉Spring 你想要如何配置Spring.

由于spring-boot-starter-web 模块已经添加了内嵌的TomcatSpring MVC
这个自动配置会默认认为你想开发一个基于Spring的Web 应用程序,并采用Spring的一写默认配置。

3.4.4.3 main 方法

最后一部分是我们的main 方法,这是一个标准的主方法,我们的main方法SpringApplication通过调用代理给Spring Boot的类run方法。 SpringApplication引导我们的应用程序,启动Spring,然后启动自动配置的Tomcat Web服务器。我们需要Example.class作为参数传递给run方法,以告诉SpringApplication哪个是主要的Spring组件。该 args数组也被传递以公开任何命令行参数。

SpringApplication.run(Example.class, args);

3.5 运行这个案例

pom.xml 根目录下打开命令行执行如下命令

mvn spring-boot:run

运行成功如下:
0. Spring Boot 2.x 入门学习指南

如果想退出程序,按快捷键 Ctrl+C

打开浏览器:http://localhost:8080/
0. Spring Boot 2.x 入门学习指南

3.6 创建一个可执行的Jar

可执行的jar和Java
Java没有提供加载嵌套jar文件的标准方法(jar文件本身包含在jar中)

为了解决这个问题,许多开发人员使用“uber” jar。uber
jar将所有应用程序依赖项中的所有类打包到一个存档中。这种方法的问题在于很难看出您的应用程序中有哪些库。如果在多个jar中使用相同的文件名(但具有不同的内容),也可能会有问题。

Spring Boot采用不同的方法,让您直接嵌套jar。

要创建一个可执行的Jar, Spring 使用一种spring-boot-maven-plugin来实现它

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

关于这个插件更多用法,参考 插件文档

完善后最终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.2.RELEASE</version>
	</parent>

	<!-- Additional lines to be added here... -->
	<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
    </dependencies>
	
	<build>
	    <plugins>
		   <plugin>
			  <groupId>org.springframework.boot</groupId>
			  <artifactId>spring-boot-maven-plugin</artifactId>
		   </plugin>
	  </plugins>
    </build>

</project>

好了,现在我们就可以使用maven打包命令将我们的项目打包生成可执行jar

mvn package

我们查看target目录,应该能看到myproject-0.0.1-SNAPSHOT.jar。

该文件大小应为10 MB左右
0. Spring Boot 2.x 入门学习指南

这里谈谈我的理解关于两个文件

  • myproject-0.0.1-SNAPSHOT.jar
  • myproject-0.0.1-SNAPSHOT.jar.original
    这两个文件,其实最先生成的是myproject-0.0.1-SNAPSHOT.jar.original,这个文件中还没有添加一些项目依赖,只能看到
    Example.class, pom.xml ,pom.properties
    有兴趣的话可以自己用压缩软件打开看看
    myproject-0.0.1-SNAPSHOT.jar是经过Spring 这个插件处理的,添加了相关依赖的可执行jar

我们只需要复制这个jar 到服务器上,然后在安装JRE的环境下,输入以下命令启动即可

java -jar .\myproject-0.0.1-SNAPSHOT.jar

0. Spring Boot 2.x 入门学习指南
打开浏览器,输入地址:http://localhost:8080/
0. Spring Boot 2.x 入门学习指南
本节完~