“ 该系列的文章主要参考Spring Boot的官方文档来进行翻译,逐步将官方文档翻译过来,方便大家共同学习和讨论,但是毕竟能力有限,如有问题,感谢大家留言指正。”
本文主要讲述了如何使用Spring Boot框架来开发一个简单的“Hello World!” Web应用,顺便为大家突出强调一些Spring Boot的关键特性。因为大多数的IDE都支持Maven这一构建工具,所以今天我们使用Maven来进行构建这个项目。
Spring.io,也就是Spring官方网站上,有很多类型项目的“Getting Started”向导手册,很大一部分都使用到了Spring Boot,如果你想解决一些特定的问题,可以先到那里去看一下,或许能找到答案。
当然你也可以走一个捷径,使用Spring官方提供的Spring项目在线初始化工具来初始化你的项目,地址是start.spring.io,在这个页面的Search for dependencies项中填写Web,填写上group和Artifact,就能初始化一个Maven工程,下载下来后,就能立刻开始你的coding工作。你可以到Spring官网查看Spring初始化工具的更多使用方法。
在这之前,我们先打开一个终端,执行以下命令,来确保我们是否已经安装了正确版本的JDK以及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
该实例需要创建一个单独的文件夹,后续的操作说明都假定你已经创建了这个目录,并且这个目录就是你的当前目录
1 创建POM文件
首先我们需要创建一个Maven的pom.xml
文件,pom.xml是对你项目的描述,用来构建你的项目,打开你常用的文本编辑器,并填写以下内容:
4.0.0
com.example
myproject
0.0.1-SNAPSHOT
org.springframework.boot
spring-boot-starter-parent
2.1.2.RELEASE
前面的工作会给你生成一个可以运行构建,你可以执行mvn package
命令来测试一下是否有问题(此时可以先忽略“jar will be empty - no content was marked for inclusion!”这个警告)。
这个时候你可以把你的项目导入到一个IDE中进行使用了(当今大多数Java IDE都已经内置了Maven功能)。简单起见,我们继续使用文本编辑器来开发这个实例。
2 添加依赖
Spring Boot提供了很多“Starters”,能让你很简单地将需要的jar包添加到你的classpath中,我们的这个实例已经在pom.xml中的 parent
配置了 spring-boot-starter-parent
,该parent预设了很多有用的Maven配置,同时也配置了 dependency-management
节点来帮助你控制你的依赖版本。
当你需要开发一种其他类型的应用时,你可以使用其他的“Starters” ,来帮助你引入其他的依赖。既然当前示例是一个web应用,我们就使用spring-boot-starter-web
这个starter来添加项目依赖。在那之前我们先执行下面的命令,来看下我们的工程里包含哪些依赖:
$ 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
依赖,引入我们需要的jar包:
org.springframework.boot
spring-boot-starter-web
此时我们再执行 mvn dependency:tree
命令,我们会发现有很多依赖的jar包被添加进来,其中还包括Tomcat Web Server以及Spring Boot的相关依赖。
3 编写代码
我们需要创建一个Java文件来完成我们的项目。默认情况下,Maven会编译 src/main/java
目录下的源文件,所以我们需要创建这个目录结构,然后添加一个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) {
SpringApplication.run(Example.class, args);
}
}
虽然这个文件里面的代码不多,但是包含的内容可不少,下面我们分几个小章节来逐步解释这里面的奥妙。
3.1 @RestController和@RequestMapping 注解
在我们的 Example
类中,第一个注解就是 @RestController
。大家都知道这是一个构造型注解,阅读代码的人看到这个注解就能获取到一些信息,同时Spring本身也从这个注解里面获取到这个类扮演了一个指定的角色。在这个示例里面,我们的类是一个web类型的 @Controller
,所以当有web请求被发送过来的时候,Spring就会找到这个地方。
注解 @RequestMapping
提供了路由信息。它告诉Spring,当有任何请求路径是 /
的HTTP请求访问时,都会被映射到 home
方法上。@RestController
注解会告诉Spring,使用字符串的形式来渲染结果,将其返回给调用方。
@RestController 和 @RequestMapping注解是Spring MVC中的注解。(它们并不归Spring Boot特有。)我们可以从Spring文档中的MVC部分获取到更多信息
3.2 @EnableAutoConfiguration 注解
第二个类级别的注解是 @EnableAutoConfiguration
。这个注解的作用是告诉Spring根据你添加的依赖jar包来推测你想如何配置Spring。因为我们前面的starter spring-boot-starter-web
添加了Tomcat和Spring MVC依赖,所以Spring会推测我们将开发一个web应用,这个时候它就会自动地进行相应配置。
Starters and Auto-configuration
设计“自动配置”是为了更方便的使用“Starters”,但是两者并没有紧紧绑定在一起,我们仍然可以自由地选择Starter之外的jar包依赖,Spring Boot仍然会基于我们的依赖尽最大可能去找到最适合的属性来配置我们的项目。
3.3 Main方法
最后一个章节来讲一下我们的 main
方法。首先它是一个标准的Java方法,代表了一个类方法执行的入口,其次我们的 main
方法还通过调用 run
来将我们的业务委托给Spring Boot的 SpringApplication
类,该类负责引导我们的应用启动Spring容器,相应的会启动我们自动配置的Tomcat Web容器。我们需要将 Example.class
作为参数传入到 run
方法中,来告诉 SpringApplication
谁是主要的Spring组件,当然参数 args
也可以通过命令行的形式传入。
4 启动示例
此时我们的应用就可以执行了。 因为我们在POM文件中配置了 spring-boot-starter-parent
,所以我们可以执行 run
这个goal来启动当前应用。在当前项目的根目录下执行 mvn spring-boot:run
来启动应用,你就可以看到类似下面的输出内容:
$ mvn spring-boot:run
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.2.RELEASE)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.222 seconds (JVM running for 6.514)
打开浏览器,地址栏输入 localhost:8080
,就可以得到下面的结果:
Hello World!
想优雅地停止当前应用,在启动当前应用的命令行界面按下 ctrl-c
即可。
5 创建可执行的Jar文件
下面我们通过生成一个可以在生产环境执行的,完全自包含的jar文件来结束我们这个示例。可执行Jar文件(有时被称为“富jar文件”)是包含了所有已编译的class文件和所有代码运行所需依赖的存档。
可执行 jars and Java
Java并没有提供一个标准的途径来加载内嵌的jar文件(也就是jar文件自身还包含了其他jar文件)。如果你想发布一个自包含的应用这就是一个问题。
为了解决这个问题,很多开发者使用共享jar这种方式。一个共享jar文件会将应用依赖的所有jar文件和编译之后class文件打入一个超级jar文件中。采用这种方式的问题是你很难再查看你的应用包含了哪些类库。如果多个jar包中的文件使用了相同的名字,但是内容不同,这也是一个问题。
Spring Boot提供了另外一种方式,能让你真正实现内嵌jar。
为了生成一个可执行jar文件,我们需要在项目的 pom.xml
中增加一个插件 spring-boot-maven-plugin
,我们可以在 dependencies
这个节点下添加以下内容:
org.springframework.boot
spring-boot-maven-plugin
在spring-boot-starter-parent的POM文件中,包含了用于绑定repackage goad的
配置,如果你没有使用这个parent,你需要自己来声明这个配置,可以从官方的插件文档中获取更详细的信息。
保存 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.2.RELEASE:repackage (default) @ myproject ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
此时在 target
目录下,我们可以看到一个大约大小为10MB的jar文件: myproject-0.0.1-SNAPSHOT.jar
,如果你想查看该文件内包含的内容,可以执行 jar tvf
命令:
$ jar tvf target/myproject-0.0.1-SNAPSHOT.jar
在 target
目录中我们还可以看到一个较小的文件: myproject-0.0.1-SNAPSHOT.jar.original
,这是在Spring Boot重新打包生成可执行jar包前Maven创建的原始jar文件。
我们可以执行 java -jar
命令来运行当前示例:
$ java -jar target/myproject-0.0.1-SNAPSHOT.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.2.RELEASE)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.536 seconds (JVM running for 2.864)
和上文一样,想优雅地停止当前应用,在启动当前应用的命令行界面按下 ctrl-c
即可。
END