On this page
11. 开发您的第一个 Spring Boot 应用程序
本节介绍如何开发一个简单的“ Hello World!”。 Web 应用程序,重点介绍了 Spring Boot 的一些关键功能。我们使用 Maven 来构建此项目,因为大多数 IDE 都支持它。
Tip
spring.io网站包含许多使用 Spring Boot 的“Starter” guides。如果您需要解决特定问题,请首先检查。
您可以通过转到start.spring.io并从依赖项搜索器中选择“ Web”启动器来简化以下步骤。这样做会生成一个新的项目结构,以便您可以立即开始编码。检查Spring Initializr 文档以获得更多详细信息。
在开始之前,请打开终端并运行以下命令,以确保安装了有效的 Java 和 Maven 版本:
$ 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
Note
该示例需要在其自己的文件夹中创建。随后的说明假定您已经创建了一个合适的文件夹,并且它是当前目录。
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 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.1.RELEASE</version>
</parent>
<!-- Additional lines to be added here... -->
</project>
上面的 Lists 应为您提供有效的构建。您可以通过运行mvn package
进行测试(目前,您可以忽略“ jar 将为空-没有内容被标记为包含!”警告)。
Note
此时,您可以将项目导入到 IDE 中(大多数现代 Java IDE 都包含对 Maven 的内置支持)。为了简单起见,我们在此示例中 continue 使用纯文本编辑器。
11.2 添加 Classpath 依赖项
Spring Boot 提供了许多“启动器”,使您可以将 jar 添加到 Classpath 中。我们的示例应用程序已经在 POM 的parent
部分中使用了spring-boot-starter-parent
。 spring-boot-starter-parent
是一个特殊的启动器,提供有用的 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
并将spring-boot-starter-web
依赖性添加在parent
部分的正下方:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
如果再次运行mvn dependency:tree
,则会看到现在还有许多其他依赖项,包括 Tomcat Web 服务器和 Spring Boot 本身。
11.3 编写代码
要完成我们的应用程序,我们需要创建一个 Java 文件。默认情况下,Maven 从src/main/java
编译源代码,因此您需要创建该文件夹结构,然后添加名为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);
}
}
尽管这里没有太多代码,但正在进行很多工作。我们将在接下来的几节中逐步介绍重要部分。
11.3.1 @RestController 和@RequestMapping 注解
我们的Example
类的第一个 Comments 是@RestController
。这称为“定型”Comments。它为阅读代码的人和 Spring 提供了提示,提示该类起特定作用。在这种情况下,我们的类是一个 Web @Controller
,因此 Spring 在处理传入的 Web 请求时会考虑使用它。
@RequestMapping
注解提供“路由”信息。它告诉 Spring,任何带有/
路径的 HTTP 请求都应 Map 到home
方法。 @RestController
Comments 告诉 Spring 将结果字符串直接渲染回调用方。
Tip
@RestController
和@RequestMapping
Comments 是 Spring MVC Comments。 (它们并非特定于 Spring Boot.)有关更多详细信息,请参见 Spring 参考文档中的MVC section。
11.3.2 @EnableAutoConfiguration 注解
第二个类级别的 Comments 是@EnableAutoConfiguration
。这个 Comments 告诉 Spring Boot 根据所添加的 jar 依赖关系“猜测”您如何配置 Spring。由于spring-boot-starter-web
添加了 Tomcat 和 Spring MVC,因此自动配置假定您正在开发 Web 应用程序并相应地设置 Spring。
Starters and Auto-configuration
自动配置旨在与“启动器”配合使用,但是这两个概念并不直接相关。您可以自由选择启动器之外的 jar 依赖项。 Spring Boot 仍会尽其所能自动配置您的应用程序。
11.3.3"main"方法
我们应用程序的最后一部分是main
方法。这只是遵循 Java 约定的应用程序入口点的标准方法。我们的 main 方法通过调用run
委托给 Spring Boot 的SpringApplication
类。 SpringApplication
引导我们的应用程序,启动 Spring,该应用程序反过来又启动自动配置的 Tomcat Web 服务器。我们需要将Example.class
作为参数传递给run
方法,以告诉SpringApplication
是主要的 Spring 组件。还将传递args
数组以公开任何命令行参数。
11.4 运行示例
此时,您的应用程序应该可以运行了。由于您使用了spring-boot-starter-parent
POM,因此您有一个有用的run
目标,可用于启动应用程序。在根项目目录中键入mvn spring-boot:run
以启动应用程序。您应该看到类似于以下内容的输出:
$ mvn spring-boot:run
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.1.RELEASE)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.222 seconds (JVM running for 6.514)
如果您打开 Web 浏览器到localhost:8080
,则应该看到以下输出:
Hello World!
要正常退出该应用程序,请按ctrl-c
。
11.5 创建一个可执行的 Jar
通过创建一个可以在生产环境中运行的完全独立的可执行 jar 文件来结束示例。可执行 jar(有时称为“胖 jar”)是包含您的已编译类以及代码需要运行的所有 jar 依赖项的归档文件。
Executable jars and Java
Java 没有提供加载嵌套 jar 文件(jar 中本身包含的 jar 文件)的标准方法。如果您要分发独立的应用程序,则可能会出现问题。
为了解决此问题,许多开发人员使用“超级”Jar子。 uber jar 将来自应用程序所有依赖项的所有类打包到单个存档中。这种方法的问题在于,很难查看应用程序中包含哪些库。如果在多个 jar 中使用了相同的文件名(但内容不同),也可能会产生问题。
Spring Boot 需要一个different approach并允许您实际上直接将 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>
Note
spring-boot-starter-parent
POM 包含<executions>
配置以绑定repackage
目标。如果不使用父 POM,则需要自己声明此配置。有关详情,请参见plugin documentation。
保存您的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.1.RELEASE:repackage (default) @ myproject ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
如果查看target
目录,应该会看到myproject-0.0.1-SNAPSHOT.jar
。该文件的大小应为 10 MB 左右。如果您想窥视内部,可以使用jar tvf
,如下所示:
$ jar tvf target/myproject-0.0.1-SNAPSHOT.jar
您还应该在target
目录中看到一个名为myproject-0.0.1-SNAPSHOT.jar.original
的小得多的文件。这是 Maven 在 Spring Boot 重新打包之前创建的原始 jar 文件。
要运行该应用程序,请使用java -jar
命令,如下所示:
$ java -jar target/myproject-0.0.1-SNAPSHOT.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.1.RELEASE)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.536 seconds (JVM running for 2.864)
和以前一样,要退出该应用程序,请按ctrl-c
。