Spring Boot进阶:原理、实战与面试题分析
上QQ阅读APP看书,第一时间看更新

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所示。

020-1

图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所示。

022-1

图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响应结果,说明整个服务已经启动成功。

023-1

图1-7 通过Postman访问HTTP端点效果示意图

现在我们已经明白如何构建、打包以及运行一个简单的Web应用程序。这是一切开发工作的起点,后续所有的案例代码都将通过这种方式展现在你面前,包括接下来要介绍的Spring Boot配置体系。