这部分介绍了如何开发一个简单的“Hello World!”web应用,并且着重描述了一些Spring boot的关键功能。因为大部分的IDE工具都支持Maven,所以用Maven构建这个项目。
11.1 创建POM文件
我们需要从创建Maven的pom.xml文件开始,pom.xml是项目的灵魂。打开任意编辑器开始编写pom文件:
<?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 https://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.5.RELEASE</version>
</parent>
<!-- Additional lines to be added here... -->
</project>
上面的代码提供了一个基础的构架,现在可以用mvn package进行测试(忽略掉“jar will be empty - no content was marked for inclusion!”的警告)。
提示:此处可以用IDE工具创建工程,为了方便起见,下面还是使用基础的文本工具编写案例。
11.2 添加类的依赖
Spring Boot提供了一些简单的“starter”方便添加jar依赖。我们之前已经将spring-boot-starter-parent添加进了POM父类依赖部分,它是一个特殊的依赖,提供了一些默认的Maven设置,以及默认的版本,这样可以省略下边一些依赖的版本设置,更方便了版本的控制。
其他的“starter”在开发时根据需要进行依赖的添加。因为这是个web应用,所以需要添加spring-boot-starter-web依赖。我们先看下目前Maven的依赖树。
$ mvn dependency:tree
[INFO] com.example:myproject:jar:0.0.1-SNAPSHOT
mvn dependency:tree命令是用来查看当前项目的依赖树结构,我们可以看到spring-boot-starter-parent本身没有依赖关系。在pom.xml文件中父类部分下面添加需要的web依赖(spring-boot-starter-web);
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
这时再次运行mvn dependency:tree,可以看到包含tomcat等一系列的依赖已经添加上了。
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) {
SpringApplication.run(Example.class, args);
}
}
虽然代码不多,不过Spring boot已经做了很多工作,下面的部分将会着重介绍一些重要的部分。
注释@RestController 、@RequestMapping
例子中第一个注释是@RestController,@RestController注解相当于@ResponseBody、@Controller合在一起的作用,提示Spring这是一个特殊的类。
@RequestMapping注释起到路由的功能,告诉Spring任何带“/”的HTTP请求都应该由@Method home 来处理,@RestController则是告诉Spring结果应该以字符串的形式响应给用户。
提示:这两个注释是SpringMVC的注释,可以在Spring的官方文档的MVC部分获取更多的细节。
注释@EnableAutoConfiguration
第二个类级别的注释@EnableAutoConfiguration是用来Spring Boot如何根据已添加的Maven依赖来配置Spring。因为spring-boot-starter-web添加了tomcat和SpringMVC,所以自动配置认为这是一个Web应用,并进行相关的设置。
主方法Main
最后的主方法部分,只是一个依据Java规范规定的程序的入口。主方法通过调用SpringApplication类的run. SpringApplication方法来启动应用程序,Spirng将根据自动配置来启动tomcat容器。
11.4 运行例子程序
此时,因为用到了spring-boot-starter-parent,所以我们有一个明确的启动目标去启动应用。在项目的根目录下,运行mvn spring-boot:run代码来启动程序,我们可以看到控制台有下面的输出:
$ mvn spring-boot:run
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.5.RELEASE)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.222 seconds (JVM running for 6.514)
如果你打开浏览器访问http://localhost:8080,你可以看到下面的输出:
Hello World!
按Ctrl+C退出程序。
11.5 创建一个可执行的jar包
最后生成一个可执行的jar包,让我们的程序可以在生产环境中运行。这个可执行的jar包包含了编译后的class文件以及所有依赖的jar包。
JAVA与可执行jar包
java并没有一个标准的方法执行嵌套jar包(jar包里包含jar包),如果你想执行一个嵌套的jar包可能会有问题。为了解决这个问题,许多开发者会使用"Uber-jar"(超级jar包),uber-jar是将所有的class文件(包含所有依赖的jar包)打包进一个单独的文件。这种解决方案的一个问题就是很难看到应用的库,并且当uber-jar中包含相同名字的文件名(不同内容)时也会出现问题。Spring Boot提供了另一种解决方案来使用嵌套jar包。
想创建一个可执行的jar包,需要在pom.xml文件里添加spring-boot-maven-plugin依赖项,添加的位置在dependencies下面:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
注意:spring-boot-starter-parent依赖项包含了<executions>配置项,从而绑定打包的信息。如果没有使用parent依赖项,则需要自行声明配置,具体看https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/maven-plugin/usage.html。
保存pom文件,然后在控制台执行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.5.RELEASE:repackage (default) @ myproject ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
在target文件夹内,会看到myproject-0.0.1-SNAPSHOT.jar文件,这个文件大小在10MB左右,如果你想看里面的内容,可以使用jar tvf命令:
$ jar tvf target/myproject-0.0.1-SNAPSHOT.jar
同时在target文件夹内,还会发现一个myproject-0.0.1-SNAPSHOT.jar.original文件,这个文件是在SpringBoot重打包前Maven创建的原型文件。
使用java -jar命令来启动程序,结果如下:
$ java -jar target/myproject-0.0.1-SNAPSHOT.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.5.RELEASE)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.536 seconds (JVM running for 2.864)
和上面一样,使用Ctrl+C结束程序。
总目录:总纲 Spring Boot官方文档(2.1.5版翻译)
下一篇:13.构建系统 Spring