1.2.2 Spring Boot应用程序结构和示例
针对一个基于Spring Boot开发的Web应用程序,其代码组织方式需要遵循一定的项目结构。在本小节中,我们将给出这一项目结构,并提供一个可以直接运行的Spring Boot Web应用程序示例。
1. Spring Boot应用程序结构
在本书中,如果不特殊说明,我们都将使用Maven来管理代码工程的结构和包依赖。一个典型的Web应用程序的项目结构如下所示:
demo-service
src/main/java
com.spring.demo
DemoApplication.java →启动类
com.spring.demo.controller →控制器组件
com.spring.demo.repository →数据访问层组件
com.spring.demo.service →业务逻辑层组件
com.spring.demo.domain →领域实体
src/main/resources
application.yml →配置文件
pom.xml →包依赖
这里有几个方面需要特别注意,分别是包依赖、启动类、控制器组件以及配置文件,下面分别展开介绍。
(1)包依赖
Spring Boot提供了一系列starter工程来简化各种组件之间的依赖关系。以开发Web服务为例,需要引入spring-boot-starter-web这个工程。在应用程序中引入spring-boot-starter-web组件就像引入一个普通的Maven依赖一样,如代码清单1-1所示。
代码清单1-1 将spring-boot-starter-web依赖包引入代码
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
一旦spring-boot-starter-web组件引入完毕,我们就可以充分利用Spring Boot提供的自动配置机制开发Web应用程序。请注意,spring-boot-starter-web包的命名上有个特殊的地方,即使用了-starter,这是Spring Boot所特有的starter机制的标识。Spring Boot中的starter是一种非常重要的机制,可以将以前繁杂的配置统一集成进starter,开发人员只需要在Maven中引入starter依赖,Spring Boot就能自动扫描要加载的信息并启动相应的默认配置。我们在本书第13章中会对Spring Boot Starter展开详细的介绍。
我们来看一下spring-boot-starter-web工程的组成部分,可以看到这个工程中并没有具体的代码,只是包含了一些pom依赖,如下所示:
org.springframework.boot:spring-boot-starter
org.springframework.boot:spring-boot-starter-tomcat
org.springframework.boot:spring-boot-starter-validation
com.fasterxml.jackson.core:jackson-databind
org.springframework:spring-web
org.springframework:spring-webmvc
可以看到这里包括了传统Spring WebMVC应用程序中会用到的spring-web和spring-webmvc组件,因此Spring Boot在底层实现上还是基于这两个组件完成了对Web请求的响应流程的构建。
本书将采用最新的Spring Boot 2.5.3版本,我们发现它所依赖的Spring组件都升级到了5.3.9版本,如图1-5所示。
图1-5 Spring Boot 2.5.3版本的依赖包示意图
(2)启动类
使用Spring Boot最重要的一个步骤是创建一个Bootstrap启动类。Bootstrap类结构简单且比较固化,如代码清单1-2所示。
代码清单1-2 Spring Boot Bootstrap类示例代码
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
显然,这里引入了一个全新的注解@SpringBootApplication。在Spring Boot中,添加了该注解的类就是整个应用程序的入口,一方面会启动整个Spring容器,另一方面会自动扫描代码包结构下的@Component、@Service、@Repository、@Controller等注解,把这些注解对应的类转化为Bean对象并全部加载到Spring容器中。
(3)控制器组件
Bootstrap类为我们提供了Spring Boot应用程序的入口,相当于应用程序已经有了最基本的骨架。接下来我们就可以添加针对HTTP请求的访问入口,表现在Spring Boot中也就是添加一系列的Controller类。这里的Controller与Spring WebMVC中的Controller在概念上是一致的,一个典型的Controller类如代码清单1-3所示。
代码清单1-3 Controller类示例代码
@RestController @RequestMapping(value="users") public class UserController { @GetMapping(value = "/{id}") public User getUserById(@PathVariable Long id) { User user = new User(); user.setId(id); user.setName("Tianyalan"); user.setPassword("123456"); return user; } }
请注意,这里为了演示方便,使用硬编码完成了一个HTTP GET请求的响应处理。上述代码中包含了@RestController、@RequestMapping和@GetMapping这三个注解。其中,@RequestMapping注解用于指定请求地址的映射关系,@GetMapping注解的作用等同于指定了GET请求的@RequestMapping注解。而@RestController注解是传统Spring MVC中所提供的@Controller注解的升级版,相当于@Controller和@ResponseEntity注解的结合体,会自动使用JSON实现序列化/反序列化操作。
(4)配置文件
最后,我们看一下配置文件。请注意配置文件可以是空的,开发人员如果不需要特别指定服务器端口的信息,那么完全可以基于Spring Boot内置的默认配置来运行Web应用程序。默认情况下,Spring Boot会使用8080作为监听HTTP请求的服务端口。
Spring Boot中的配置体系非常有特色,充分采用了“约定优于配置”(Convention Over Configuration)这一设计理念。作为专题,我们将在1.2.3节中具体讲解该内容。
2. Spring Boot应用程序示例
基于Spring Boot创建Web应用程序的方法有很多,其中最简单、最直接的方法就是使用Spring官方提供的Spring Initializr模板。直接访问Spring Initializr网站(http://start.spring.io/),选择创建一个Maven项目并指定相应的Group和Artifact,然后在添加的依赖中选择Spring Web,点击GENERATE按钮即可。界面效果如图1-6所示。
图1-6 使用Spring Initializr创建Web应用程序示意图
当然,对于有一定开发经验的人员而言,完全可以基于Maven本身的功能特性和结构来生成图1-6中的代码工程。
接下来,让我们来为这个代码工程添加一些RESTful风格的HTTP端点。这里,直接使用前面已经构建完成的UserController。
现在RESTful端点已经开发完成,我们需要对这个应用程序进行打包。基于Spring Boot和Maven,当我们使用mvn package命令构建整个应用程序时,将得到一个userservice-0.0.1-SNAPSHOT.jar文件。而这个JAR文件就是可以直接运行的可执行文件,内置了Tomcat Web服务器。也就是说,我们可以通过如代码清单1-4所示的命令直接运行这个Spring Boot应用程序。
代码清单1-4 Spring Boot应用程序启动命令
java -jar userservice-0.0.1-SNAPSHOT.jar
那么,如何验证服务是否启动成功,以及HTTP请求是否得到正确响应呢?在本书中,我们将引入Postman来演示如何通过HTTP暴露的端点进行远程服务访问。Postman提供了强大的Web API和HTTP请求调试功能,界面简洁明晰,操作也比较方便快捷和人性化。Postman能够发送任何类型的HTTP请求(如GET、HEAD、POST、PUT等),并能附带任何数量的参数和HTTP请求头(Header)。
通过Postman访问http://localhost:8080/users/1端点,我们可以得到如图1-7所示的HTTP响应结果,说明整个服务已经启动成功。
图1-7 通过Postman访问HTTP端点效果示意图
现在我们已经明白如何构建、打包以及运行一个简单的Web应用程序。这是一切开发工作的起点,后续所有的案例代码都将通过这种方式展现在你面前,包括接下来要介绍的Spring Boot配置体系。