使用Java开发一个简单的"Hello World!" web应用,来强调下Spring Boot的一些关键特性。
我们将使用Maven构建该项目,因为大多数IDEs都支持它。
在开始前,你需要打开一个终端,检查是否安装可用的Java版本和Maven:
java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
mvn -v
Apache Maven 3.5.0 (33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-11T13:58:10-07:00)
Maven home: C:\Softwares\apache-maven-3.5.0\bin\..
Java version: 1.8.0_45, 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.8.RELEASE</version>
</parent>
<!-- Additional lines to be added here... -->
</project>
这会给你一个可运转的构建,你可以通过运行 mvn package 测试它(现在你可以忽略"jar将是空的-没有包含任何内容!"的警告)。
2.添加classpath依赖
Spring Boot提供很多"Starter POMs",这能够让你轻松的将jars添加到你的classpath下。我们的示例程序已经在POM的partent节点使用了 spring-boot-starter-parent 。
spring-boot-starter-parent 是一个特殊的starter,它提供了有用的Maven默认设置。同时,它也提供了一个 dependency-management 节点,这样对于”blessed“依赖你可以省略version标记。
其他的”Starter POMs“简单的提供依赖,这些依赖可能是你开发特定类型的应用时需要的。由于正在开发一个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>
如果再次在pom.xml所在文件目录运行 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.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);
}
}
尽管这里没有太多代码,但很多事情正在发生。让我们分步探讨重要的部分。
3.1@RestController和@RequestMapping注解
- 我们的Example类上使用的第一个注解是 @RestController 。这被称为一个构造型(stereotype)注解。它为阅读代码的人们提供建议。对于Spring,该类扮演了一个特殊角色。在本示例中,我们的类是一个web @Controller ,所以当处理进来的web请求时,Spring会询问它。
- @RequestMapping 注解提供路由信息。它告诉Spring任何来自"/"路径的HTTP请求都应该被映射到 home 方法。
- @RestController 注解告诉Spring以字符串的形式渲染结果,并直接返回给调用者。
注: @RestController 和 @RequestMapping 注解是Spring MVC注解(它们不是Spring Boot的特定部分)。
3.2@EnableAutoConfiguration注解
- 第二个类级别的注解是 @EnableAutoConfiguration 。这个注解告诉Spring Boot根据添加的jar依赖猜测你想如何配置Spring。
- 由于 spring-boot-starter-web 添加了Tomcat和Spring MVC,所以auto-configuration将假定你正在开发一个web应用并相应地对Spring进行设置。
- Starter POMs和Auto-Configuration:设计auto-configuration的目的是更好的使"Starter POMs",但这两个概念没有直接的联系。你可以自由地挑选starter POMs以外的jar依赖,并且Spring Boot将仍旧尽最大努力去自动配置你的应用。
3.3main方法
- 我们的应用程序最后部分是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 来启动应用:
如果使用一个浏览器打开localhost:8080,你应该可以看到以下输出:
Hello World!
- 点击 ctrl-c 温雅地关闭应用程序。
创建一个可执行jar
让我们通过创建一个完全自包含的可执行jar文件来结束我们的示例,该jar文件可以在生产环境运行。可执行jars(有时候被成为胖jars "fat jars")是包含你的编译后的类和你的代码运行所需的依赖jar的存档。
可执行jars和Java:Java没有提供任何标准的加载内嵌jar文件(即jar文件中还包含jar文件)的方法。如果你想发布一个自包含的应用这就是一个问题。为了解决该问题,很多开发者采用"共享的"jars。一个共享的jar简单地将来自所有jars的类打包进一个单独的“超级jar”。采用共享jar方式的问题是很难区分在你的应用程序中可以使用哪些库。在多个jars中如果存在相同的文件名(但内容不一样)也会是一个问题。
Spring Boot采取一个不同的途径,并允许你真正的内嵌jars。
-
为了创建可执行的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包含用于绑定repackage目标的 <executions> 配置。如果你不使用parent POM,你将需要自己声明该配置。
-
保存你的pom.xml,然后从命令行运行 mvn package :
[INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ myproject --- [INFO] Building jar: D:\tests\target\myproject-0.0.1-SNAPSHOT.jar [INFO] ---------------------------------------------------------------------- [INFO] BUILD SUCCESS [INFO] ---------------------------------------------------------------------- [INFO] Total time: 4.515 s [INFO] Finished at: 2017-10-26T17:19:05+08:00 [INFO] Final Memory: 19M/212M
为了运行该应用程序,你可以使用 java -jar 命令:
和以前一样,点击 ctrl-c 来温柔地退出程序。