这部分介绍了如何开发一个简单的“Hello World!”web应用,并且着重描述了一些Spring boot的关键功能。因为大部分的IDE工具都支持Maven,所以用Maven构建这个项目。
我们需要从创建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工具创建工程,为了方便起见,下面还是使用基础的文本工具编写案例。
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-SNAPSHOTmvn 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等一系列的依赖已经添加上了。
先创建一个简单的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容器。
此时,因为用到了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退出程序。
最后生成一个可执行的jar包,让我们的程序可以在生产环境中运行。这个可执行的jar包包含了编译后的class文件以及所有依赖的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