11. 开发您的第一个 Spring Boot 应用程序

让我们开发一个简单的“ Hello World!” Java Web 应用程序,重点介绍了 Spring Boot 的一些关键功能。因为大多数 IDE 都支持,所以我们将使用 Maven 来构建该项目。

Tip

spring.io网站包含许多使用 Spring Boot 的“Starter”指南。如果您正在寻找解决特定问题的方法;首先检查那里。

您可以转到start.spring.io并从依赖项搜索器中选择webStarter 程序,从而简化以下步骤。这将自动生成一个新的项目结构,以便您可以立即开始编码。检查有关更多详细信息的文档

在开始之前,请打开终端以检查您是否安装了有效的 Java 和 Maven 版本。

$ java -version
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
$ mvn -v
Apache Maven 3.2.3 (33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-11T13:58:10-07:00)
Maven home: /Users/user/tools/apache-maven-3.1.1
Java version: 1.7.0_51, 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>1.5.9.RELEASE</version>
    </parent>

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

</project>

这将为您提供一个有效的构建,您可以通过运行mvn package对其进行测试(您现在可以忽略“ jar 将为空-没有内容被标记为包含!”警告)。

Note

此时,您可以将项目导入到 IDE 中(大多数现代 Java IDE 都包括对 Maven 的内置支持)。为简单起见,在此示例中,我们将 continue 使用纯文本编辑器。

11.2 添加 Classpath 依赖项

Spring Boot 提供了许多“启动器”,可以轻松地将 jar 添加到您的 Classpath 中。我们的示例应用程序已经在 POM 的parent部分中使用了spring-boot-starter-parentspring-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.stereotype.*;
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方法。 @RestControllerComments 告诉 Spring 将结果字符串直接渲染回调用方。

Tip

@RestController@RequestMappingComments 是 Spring MVCComments(它们并不特定于 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 ::  (v1.5.9.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子。超级 jar 只是将所有 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:1.5.9.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 ::  (v1.5.9.RELEASE)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.536 seconds (JVM running for 2.864)

和以前一样,要正常退出该应用程序,请点击ctrl-c