2.1.1 查看初始化的 Spring Boot 新项目
图 2-2 中值得注意的第一件事是,整个项目结构遵循传统 Maven 或 Gradle 项目的布局,即主要应用程序代码位于 src/main/java 目录里,资源都在 src/main/resources 目录里,测试代码则在 src/test/java 目录里。此刻还没有测试资源,但如果有的话,要放在 src/test/resources 里。
再进一步,你会看到项目里还有不少文件。
build.gradle:Gradle 构建说明文件。
ReadingListApplication.java
:应用程序的启动引导类(bootstrap class),也是主要的 Spring 配置类。application.properties
:用于配置应用程序和 Spring Boot 的属性。ReadingListApplicationTests.java
:一个基本的集成测试类。
因为构建说明文件里有很多 Spring Boot 的优点尚未揭秘,所以我打算把最好的留到最后,先让我们来看看 ReadingListApplication.java
。
1. 启动引导 Spring
ReadingListApplication
在 Spring Boot 应用程序里有两个作用:配置和启动引导。首先,这是主要的 Spring 配置类。虽然 Spring Boot 的自动配置免除了很多 Spring 配置,但你还需要进行少量配置来启用自动配置。正如代码清单 2-1 所示,这里只有一行配置代码。
代码清单 2-1 ReadingListApplication.java
不仅是启动引导类,还是配置类
package readinglist;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication ←---开启组件扫描和自动配置
public class ReadingListApplication {
public static void main(String[] args) {
SpringApplication.run(ReadingListApplication.class, args); ←---负责启动引导应用程序
}
}
@SpringBootApplication
开启了 Spring 的组件扫描和 Spring Boot 的自动配置功能。实际上, @SpringBootApplication
将三个有用的注解组合在了一起。
Spring 的
@Configuration
:标明该类使用 Spring 基于 Java 的配置。虽然本书不会写太多配置,但我们会更倾向于使用基于 Java 而不是 XML 的配置。Spring 的
@ComponentScan
:启用组件扫描,这样你写的 Web 控制器类和其他组件才能被自动发现并注册为 Spring 应用程序上下文里的 Bean。本章稍后会写一个简单的 Spring MVC 控制器,使用@Controller
进行注解,这样组件扫描才能找到它。Spring Boot 的
@EnableAutoConfiguration
:这个不起眼的小注解也可以称为@Abracadabra
2 ,就是这一行配置开启了 Spring Boot 自动配置的魔力,让你不用再写成篇的配置了。
2 abracadabra 的意思是咒语。 - 译者注
在 Spring Boot 的早期版本中,你需要在 ReadingListApplication
类上同时标上这三个注解,但从 Spring Boot 1.2.0 开始,有 @SpringBootApplication
就行了。
如我所说, ReadingListApplication
还是一个启动引导类。要运行 Spring Boot 应用程序有几种方式,其中包含传统的 WAR 文件部署。但这里的 main()
方法让你可以在命令行里把该应用程序当作一个可执行 JAR 文件来运行。这里向 SpringApplication.run()
传递了一个 ReadingListApplication
类的引用,还有命令行参数,通过这些东西启动应用程序。
实际上,就算一行代码也没写,此时你仍然可以构建应用程序尝尝鲜。要构建并运行应用程序,最简单的方法就是用 Gradle 的 bootRun
任务:
$ gradle bootRun
bootRun
任务来自 Spring Boot 的 Gradle 插件,我们会在 2.1.2 节里详细讨论。此外,你也可以用 Gradle 构建项目,然后在命令行里用 java
来运行它:
$ gradle build
...
$ java -jar build/libs/readinglist-0.0.1-SNAPSHOT.jar
应用程序应该能正常运行,启动一个监听 8080 端口的 Tomcat 服务器。要是愿意,你可以用浏览器访问 http://localhost:8080 ,但由于还没写控制器类,你只会收到一个 HTTP 404(NOT FOUND)错误,看到错误页面。在本章结束前,这个 URL 将会提供一个阅读列表应用程序。
你几乎不需要修改 ReadingListApplication.java
。如果你的应用程序需要 Spring Boot 自动配置以外的其他 Spring 配置,一般来说,最好把它写到一个单独的 @Configuration
标注的类里。(组件扫描会发现并使用这些类的。)极度简单的情况下,可以把自定义配置加入 ReadingListApplication.java
。
2. 测试 Spring Boot 应用程序
Initializr 还提供了一个测试类的骨架,可以基于它为你的应用程序编写测试。但 ReadingListApplicationTests
(代码清单 2-2)不止是个用于测试的占位符,它还是一个例子,告诉你如何为 Spring Boot 应用程序编写测试。
代码清单 2-2 @SpringApplicationConfiguration
加载 Spring 应用程序上下文
package readinglist;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import readinglist.ReadingListApplication;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(
classes = ReadingListApplication.class) ←---通过 Spring Boot 加载上下文
@WebAppConfiguration
public class ReadingListApplicationTests {
@Test
public void contextLoads() { ←---测试加载的上下文
}
}
一个典型的 Spring 集成测试会用 @ContextConfiguration
注解标识如何加载 Spring 的应用程序上下文。但是,为了充分发挥 Spring Boot 的魔力,这里应该用 @SpringApplicationConfiguration
注解。正如你在代码清单 2-2 里看到的那样, ReadingListApplicationTests
使用 @SpringApplicationConfiguration
注解从 ReadingListApplication
配置类里加载 Spring 应用程序上下文。
ReadingListApplicationTests
里还有一个简单的测试方法,即 contextLoads()
。实际上它就是个空方法。但这个空方法足以证明应用程序上下文的加载没有问题。如果 ReadingListApplication
里定义的配置是好的,就能通过测试。如果有问题,测试就会失败。
当然,现在这只是一个新的应用程序,你还会添加自己的测试。但 contextLoads()
方法是个良好的开端,此刻可以验证应用程序提供的各种功能。第 4 章会更详细地讨论如何测试 Spring Boot 应用程序。
3. 配置应用程序属性
Initializr 为你生成的 application.properties 文件是一个空文件。实际上,这个文件完全是可选的,你大可以删掉它,这不会对应用程序有任何影响,但留着也没什么问题。
稍后,我们肯定有机会向 application.properties 里添加几个条目。但现在,如果你想小试牛刀,可以加一行看看:
server.port=8000
加上这一行,嵌入式 Tomcat 的监听端口就变成了 8000,而不是默认的 8080。你可以重新运行应用程序,看看是不是这样。
这说明 application.properties 文件可以很方便地帮你细粒度地调整 Spring Boot 的自动配置。你还可以用它来指定应用程序代码所需的配置项。在第 3 章里我们会看到好几个例子,演示 application.properties
的这两种用法。
要注意的是,你完全不用告诉 Spring Boot 为你加载 application.properties
,只要它存在就会被加载,Spring 和应用程序代码都能获取其中的属性。
我们差不多已经把初始化的项目介绍完了,还剩最后一样东西,让我们来看看 Spring Boot 应用程序是如何构建的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论