让我们使用 Java 开发一个简单的 Hello World! web 应用程序,以便体现 Spring Boot 的一些关键特性。我们将使用 Maven 构建该项目,因为大多数 IDE 都支持它。
提示
spring.io 网站上有许多使用 Spring Boot 的
入门指南,如果您正在寻找具体问题的解决方案,可先从上面寻找。您可以到 start.spring.io 使用依赖搜索功能选择
web
starter 来快速完成以下步骤。它将自动生成一个新的项目结构,以便您可以立即开始编码。查看文档了解更多信息。
在开始之前,打开终端检查您是否安装了符合要求的 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
提示
此示例需要在您自己的文件夹中创建,后续的步骤说明假设您已经创建了这个文件夹,它是您的 当前目录。
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 will be empty - no content was marked for inclusion! 警告信息)。
注意
此时,您可以将项目导入 IDE(大部分的现代 Java IDE 都内置 Maven 支持)。为了简单起见,我们将继续在这个例子中使用纯文本编辑器。
2、添加 Classpath 依赖
Spring Boot 提供了多个 “Starter”,可以让您方便地将 jar 添加到 classpath 下。我们的示例应用已经在 POM 的 parent
部分使用了 spring-boot-starter-parent
。spring-boot-starter-parent
是一个特殊 Starter,它提供了有用的 Maven 默认配置。此外它还提供了依赖管理功能,您可以忽略这些依赖的版本(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
本身不提供依赖。我们可以在 parent
下方立即编辑 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 服务器和 Spring Boot 本身。
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);
}
}
虽然没有多少代码,但它仍然做了很多事情。让我们看看里面重要的部分。
3.1、@RestController 与 @RequestMapping 注解
Example
类中的第一个注解是 @RestController
,该注解被称作 stereotype 注解。它能为代码阅读者提供一些提示,对于 Spring 而言,这个类具有特殊作用。在本示例中,我们的类是一个 web @Controller
,因此 Spring 在处理传入的 web 请求时会考虑它。
@RequestMapping
注解提供了 routing(路由)信息。它告诉 Spring,任何具有路径为 /
的 HTTP 请求都应映射到 home
方法。@RestController
注解告知 Spring 渲染结果字符串直接返回给调用者。
提示
@RestController
和@RequestMapping
是 Spring MVC 注解(它们不是 Spring Boot 特有的)。有关更多详细信息,请参阅 Spring 参考文档中的 MVC 章节
3.2、@EnableAutoConfiguration 注解
第二个类级别注解是 @EnableAutoConfiguration
。此注解告知 Spring Boot 根据您添加的 jar 依赖来“猜测”您想如何配置 Spring 并进行自动配置,由于 spring-boot-starter-web
添加了 Tomcat 和 Spring MVC,auto-configuration(自动配置)将假定您要开发 web 应用并相应设置了 Spring。
Starter 与自动配置 Auto-configuration 被设计与 Starter 配合使用,但这两个概念并不是直接相关的。您可以自由选择 starter 之外的 jar 依赖,Spring Boot 仍然会自动配置您的应用程序。
3.3、main 方法
应用的最后一部分是 main
方法。这只是一个标准方法,其遵循 Java 规范中定义的应用程序入口点。我们的 main 方法通过调用 run
来委托 Spring Boot 的 SpringApplication
类,SpringApplication
类将引导我们的应用,启动 Spring,然后启动自动配置的 Tomcat web 服务器。我们需要将 Example.class
作为一个参数传递给 run
方法来告知 SpringApplication
,它是 Spring 主组件。同时还传递 args
数组以暴露所有命令行参数。
4、运行示例
此时,我们的应用应该是可以工作了。由于您使用了 spring-boot-starter-parent
POM,因此您可以使用 run
来启动应用程序。在根目录下输入 mvn spring-boot:run
以启动应用:
$ mvn spring-boot:run
. ____ _ __ _ _
/ / ___'_ __ _ _(_)_ __ __ _
( ( )___ | '_ | '_| | '_ / _` |
/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |___, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.0.0.RELEASE)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.222 seconds (JVM running for 6.514)
如果您用浏览器打开了 localhost:8080
,您应该会看到以下输出:
Hello World!
要平滑退出程序,请按 ctrl+c
。
5、创建可执行 jar
我们通过创建一个完全自包含(self-contained)的可执行 jar 文件完成了示例。该 jar 文件可以在生产环境中运行。可执行 jar(有时又称为 fat jars
)是包含了编译后的类以及代码运行时所需要相关的 jar 依赖的归档文件。
可执行 jar 与 Java
Java 不提供任何标准方式来加载嵌套的 jar 文件(比如本身包含在 jar 中的 jar 文件)。如果您想分发自包含的应用,这可能是个问题。
为了解决此问题,许多开发人员使用了 uber jar,uber jar 从所有应用的依赖中打包所有的类到一个归档中。这种方法的问题在于,您很难看出应用程序实际上使用到了哪些库。如果在多个 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-parent
POM 包含了<executions>
配置,用于绑定repackage
。如果您没有使用父 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.0.0.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
的较小文件。这是在 Spring Boot 重新打包之前由 Maven 所创建的原始 jar 文件。
使用 java -jar
命令运行该应用:
$ java -jar target/myproject-0.0.1-SNAPSHOT.jar
. ____ _ __ _ _
/ / ___'_ __ _ _(_)_ __ __ _
( ( )___ | '_ | '_| | '_ / _` |
/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |___, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.0.0.RELEASE)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.536 seconds (JVM running for 2.864)
跟之前一样, 要平滑退出应用,请按 ctrl-c
。