大家好呀,我是七哥。
本篇是《Spring江湖路》系列文章的第 4 回,持续更新中…
本文提供完整代码示例,详见 https://gitee.com/isevenluo/spring-road/ 的 spring-road02 目录。
公众号:七哥聊编程,回复【pdf】获取精选计算机电子书资源!
大家都知道,我们要用 Spring 创建一个RESTful 应用程序,是需要为框架做很多事情的,比如往项目的构建文件中添加各种库依赖,还要自己写各种配置文件,因为 Spring 虽然牛逼的提供了很多优秀的特性,但是我们还是需要配置告诉 Spring 该怎么做。
但是,现在都啥时代了,全人类都讲究自动化、智能化了,我们程序员开发任务为啥就不能来点自动化、智能化呢? 这不, Spring Boot
横空出世了。它拥有的 起步依赖、自动配置 特性,让我们拒绝那些繁琐且千篇一律的配置,解放程序员的双手,集中精力开发应用程序即可。
今天这篇文章的目标,就是带大家用 Spring Boot
开发一个视频观看列表的应用程序,一起感受 Spring Boot
的强大。
1. 前言
我们今天要开发的这个视频观看列表应用程序,可以支持用户查找观看列表,输入自己想看的视频信息,删除已经看过的视频。
技术栈采用 Spring Boot 快速开发、Spring MVC 处理 Web 请求, Thymeleaf 来定义 Web 视图,Spring Data JPA 来持久化观看列表到数据化,数据库使用 H2。
2. 初始化项目
创建 Spring Boot 项目的几种方式我们之前已经讲过了,本质都是使用的 Spring Initializr,选择最合适的就好,但是要确保勾选了我们需要的依赖。
使用 IDEA 选择 Initializr 创建项目:
创建完成后,就得到了如下图的项目结构:
基本上 Spring Boot 项目初始化完成后的结构都是一样的,你可能已经着急想开发应用程序了,但是在进入下一步写代码之前,我们还是停下脚步来具体看下项目里的这些东西都是干啥的,我觉得这是很重要的!搞清楚了大概的原理在开发的时候就不容易踩坑了,免得你在实际工作中不明所以,改这些文件也是糊里糊涂的,这样容易出 bug 的~~
3. Spring Boot项目的结构
总体来说 Spring Boot 项目是遵循 Maven 或者 Gradle 的项目布局的,主要代码放在 src/main/java
路径下,配置文件放到 src/main/resources
路径下,测试代码放到 src/test/java
路径下,如果有测试配置就放在 src/test/resources
路径。
我们再来看下我们项目根目录中还有不少文件:
- build.gradle: Gradle 构建说明文件;
- SpringRoad02Application.java:应用程序的启动引导类,同时也是主要的 Spring 配置类;
- application.properties:用于配置应用程序和 Spring Boot 的属性;
- SpringRoad02ApplicationTests.java:基本的集成测试类;
启动引导Spring
SpringRoad02Application 它的作用是启动引导和配置。
//开启组件扫描和自动配置
@SpringBootApplication
public class SpringRoad02Application {
public static void main(String[] args) {
// 启动引导应用程序
SpringApplication.run(SpringRoad02Application.class, args);
}
}
@SpringBootApplication 这个注解是如何开启组件扫描和自动配置功能的呢?
这是因为 @SpringBootApplication 注解将三个有用的注解组合在了一起:
- @SpringBootConfiguration:标明该类是一个基于 Java 代码的 Spring 配置类;
- @ComponentScan:启用组件扫描,这样项目中我们写的控制器和其它服务类才会被 Spring 扫描注册为应用程序上下文中的 Bean;
- @EnableAutoConfiguration:这个注解最牛逼,就是它开启了 Spring Boot 的黑魔法,让我们不用写 Spring 那些繁琐的 xml 配置;
那要运行 Spring Boot 应用,除了传统的 WAR 包部署,启动类的 main 方法支持我们在命令行里把应用程序当成可执行的 JAR 包来运行。实际上就算我们一行代码都不写,这个项目已经是可运行的了,最简单的构建运行方法就是 Gradle 的 bootRun 任务,你可以执行下面的命令感受一下:
gradle bootRun
启动成功截图:
测试Spring Boot应用程序
Initializr 还提供了一个测试类:SpringRoad02ApplicationTests ,可以基于它我们来为应用程序编写测试。
@SpringBootTest // 通过 Spring Boot 加载上下文
class SpringRoad02ApplicationTests {
@Test
void contextLoads() {
}
}
可以直接运行这个 contextLoads() 方法,不报错就说明加载应用程序上下文是没有问题的:
配置应用程序属性
Initializr 生成的项目中有一个空的 application.properties 文件,这个文件其实是可选的,你可以删掉,但是一般会保留,因为实际项目肯定都有很多的属性配置,比如数据库、mq、redis 等等。
我们可以给这个文件配置一个属性 sever.port=8000
试试看:
加上后,我们在启动程序,它内嵌的 Tomcat 监听端口就从默认的 8080 改为了 8000。
神奇的地方在于,我们完全不用告诉 Spring Boot 去加载 application.properties 文件,只要它在根目录存在就会自动被加载,Spring 和 应用程序就可以获取其中配置的属性。
4. 构建说明文件,起步依赖介绍
项目基本结构我们上面都已经介绍的差不多了,那接下里我们就来看看 Spring Boot 应用程序到底是如何构建的。比如 Spring Boot 为什么可以支持打 JAR 包部署? 如果没有 Spring Boot 我们要使用 Spring MVC 需要添加哪个依赖,应该用哪个版本的 Spring Data JPA? 这些包放在一起的兼容性如何?
上面这些问题,都是我们在开发 Spring 应用程序会遇到的问题,一般情况下项目需要依赖包我们都是直接从其它项目拷贝过来,因为现有项目经过了测试,依赖jar包之前的兼容性经过了测试,出现问题的情况就比较小。不过就算这样,这也是一项复杂繁琐的工作。
好在 Spring Boot 的出现解放了我们奋战在一线的程序员,因为它引入了起步依赖这个特性,简而言之就是可以根据功能来引入对应的依赖包。
比如我们要开发一个 Web 应用,它使用 Thymeleaf,通过 Spring Data JPA 来持久化数据,那我们的构建文件就只需要写上这些功能就可以了。
比如下面这样,就是我通过 Spring Initializr
创建 Spring Boot 应用程序后 Gradle 构建文件里的包依赖说明:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframew