JavaSpringBoot“一课一得“

Java Spring Boot 开发指南:从入门到精通

什么是 Spring Boot?

Spring Boot 是由 Pivotal 团队提供的框架,其设计目的在于简化 Spring 应用的初始搭建以及开发流程。借助自动配置的特性,它能够让开发者迅速上手,无需为繁琐的配置而烦恼,从而将更多的精力投入到业务逻辑的实现上。

Spring Boot 主要优势

  • 自动配置:依据项目的依赖情况,自动为你配置 Spring 框架。
  • 起步依赖:以一组特定的依赖关系形式呈现,极大地简化了 Maven/Gradle 配置。
  • 嵌入式服务器:内置了 Tomcat、Jetty 等服务器,无需再单独部署 WAR 文件。
  • Actuator:为应用提供生产级别的功能,像健康检查、指标监控等。

接下来,我将结合我上课所学的知识,向大家讲解一下Spring Boot Web应用开发的相关知识。

一、MVC架构应用

spring-boot-starter-web

  • Spring Boot 将传统 Web 开发的 mvc、json、tomcat 等框架整合,提供了 spring-boot-starter-web 组件,简化了 Web 应用配置。
  • 创建 SpringBoot 项目勾选 Spring Web 选项后,会自动将 spring-boot-starter-web 组件加入到项目中。
  • spring-boot-starter-web 启动器主要包括 web、webmvc、json、tomcat 等基础依赖组件,作用是提供 Web 开发场景所需的所有底层依赖。
    • webmvc 为 Web 开发的基础框架,json 为 JSON 数据解析组件,tomcat 为自带的容器依赖。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

MVC

- 使用Spring Boot开发Web应用程序时,Spring MVC是其背后的主要驱动力,它为Web应用提供了模型-视图-控制器(MVC)的架构和组件。

- MVC,即模型(Model)、视图(View)、控制器(Controller),是一种设计模式,用于将应用程序分为三个主要组件。

控制器注解

  • @Controller 注解,控制器类中的方法通常返回一个字符串,代表逻辑视图的名称。
  • 这个视图名将被解析为一个实际的视图,例如一个 JSP、Thymeleaf 或 FreeMarker 模板。
@Controller
public class HelloController {

    @RequestMapping("/hello")
    public String index(ModelMap map){
        map.addAttribute("name", "zhangsan");
        return "hello";
    }
}
  • @RestController 是 @Controller 和 @ResponseBody 注解的结合体。它标记一个类为控制器,且类中的每个方法默认返回数据而非视图。
  • @RestController 注解会将返回的对象数据转换为 JSON 格式。
@RestController
public class HelloController {

    @RequestMapping("/user")
    public User getUser(){
        User user = new User();
        user.setUsername("zhangsan");
        user.setPassword("123");
        return user;
    }
}

开发基本的Web应用

- Spring Boot没有严格的项目结构,但它有一些约定,一个典型的Spring Boot项目的包结构如下:

目录描述
com.example.myapp项目的根包,通常以域名或公司名称的反转来命名
controller存放处理请求和响应的控制器类
service包含业务逻辑的服务类
repository数据访问和持久化层,使用 MyBatis - Plus 等技术时可能命名为 mapper 或 dao
model存放模型类,通常是 POJO(Plain Old Java Object)类,用于表示应用程序中的数据结构
config存放配置类,用于配置应用程序的一些特殊设置,如数据库连接、安全配置等
dto数据传输对象(Data Transfer Object),这里存放 DTO 类,用于在层之间传输数据,特别是在 Controller 和 Service 层之间
util存放工具类,通常包含一些辅助性方法或工具函数
  • 构建一个能够响应用户请求的 Web 服务,只需要经过以下三步:
    • 引入 spring - boot - starter - web 依赖。
    • 创建一个带有 @RestController 注解的类。
    • 在此类中定义一些带有 @RequestMapping 或其相关注解的方法。
@RestController
public class HelloController {

    @RequestMapping(value="/hello")
    public String index(){
        return "Hello World!";
    }
}

二、请求与相应

请求映射

  • @RequestMapping 是 Spring MVC 中的核心注解,用于将请求路径映射到特定的控制器方法。
属性描述示例
value/path定义 URI 模式,是 @RequestMapping 最常用属性,类型为 String[]
@RequestMapping("/books")
method
定义 HTTP 请求方法(如 GET、POST 等 ),类型为 RequestMethod[]
@RequestMapping(value="/books", method=RequestMethod.GET)
params定义请求必须满足的参数条件(参数存在、值匹配等 ),类型为 String[]@RequestMapping(value="/books", params="type=novel")(仅匹配含 type=novel 参数的请求 )
headers定义必须满足的请求头条件,类型为 String[]@RequestMapping(value="/books", headers="Referer=http://www.example.com/")(仅匹配指定 Referer 的请求 )

常见匹配方法

  • @RequestMapping ("/books") 会将所有到 /books 的请求映射到控制器方法
  • @RequestMapping 注解的 method 属性允许根据 HTTP 请求的方法(如 GET、POST、PUT、DELETE 等)来进一步限定请求的匹配:
    @RequestMapping(value = "/users", method = RequestMethod.GET)
  • 为了简化开发,Spring 还提供了一些快捷注解:
    • @GetMapping: HTTP 的 GET 方法。
    • @PostMapping: HTTP 的 POST 方法。
    • @PutMapping: HTTP 的 PUT 方法。
    • @DeleteMapping: HTTP 的 DELETE 方法。
    • @PatchMapping: HTTP 的 PATCH 方法

参数绑定

  • 在 Web 应用中,服务端经常需要获取浏览器传递的数据,例如用于搜索查询、分页、排序和过滤等场景。
  • 在 Spring Boot 中,有多种注解可用于将请求中传递的数据绑定到处理器方法的参数中,以便获取并处理这些数据。常用的注解包括:
    • @PathVariable: 从 URI 模板中提取值,如从 /books/{id} 中提取 id。
    • @RequestParam: 获取查询参数或表单数据。
    • @RequestBody: 将请求主体(通常为 JSON 或 XML)绑定到方法参数。
    • @RequestHeader: 获取请求头的值。
    • @CookieValue: 从 cookie 中提取值。

JSON响应

  • spring-boot-starter-web 依赖自带了 Jackson 库,它可以自动将 Java 对象序列化为 JSON 格式。
  • Jackson 支持将各种 Java 对象序列化为 JSON,包括列表(List)、映射(Map)、集合(Set)、基本数据类型及其包装类等。
  • 当使用 @RestController 注解时,Spring Boot 会自动使用 Jackson 库来完成这些对象的序列化。

ResponseEntity

用于全面控制 HTTP 响应,涵盖状态码、头部信息和响应体内容 。

@GetMapping("/item/{id}")
public ResponseEntity<Item> getItem(@PathVariable Long id) {
    Item item = itemService.findById(id);
    if (item != null) 
        return ResponseEntity.ok(item);
    } else {
        return ResponseEntity.notFound().build();
    }
}

三、构建RESTful服务

概述

  • RESTful 服务是基于 REST(Representational State Transfer,表述性状态转移)架构风格的 Web 服务。
  • REST 并不是一个标准,它更像一组客户端和服务端交互时的架构理念和设计原则,基于这种架构理念和设计原则的 Web API 更加简洁,更有层次。

特点

  • 在 RESTful 架构中,所有的事物都视为资源,这些资源通过 URI(统一资源标识符)进行标识。例如,在提供书籍和作者信息的服务中,“书” 和 “作者” 都被视为资源,它们分别可以通过类似 /books 和 /authors 的 URI 进行访问。
  • 资源可以有不同的表示形式,如 JSON、XML 等。客户端请求一个资源时,服务器返回该资源的特定表示形式。客户端和服务器之间的交互完全通过这些表示形式进行。
  • 在 RESTful 架构中,所有的交互都必须是无状态的。这意味着每个请求必须包含所有必要的信息,以便服务器能够理解和处理该请求,而不依赖于之前的请求或存储在服务器上的上下文信息。

使用 SpringDoc 生成 API 文档

  • springdoc-openapi 是一个专为 Spring Boot 应用程序设计的开源库,可以快速、简便地生成 API 文档,从而促进前后端团队的无缝协作。
  • springdoc-openapi 还内嵌了 Swagger UI,这为开发者和用户提供了一个直观的界面来浏览和测试 API。
  • 为了在 Spring Boot 项目中集成 springdoc-openapi,首先需要在项目的 pom.xml 中添加相应的依赖
    <dependency>
        <groupId>org.springdoc</groupId>
        <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
        <version>2.1.0</version>
    </dependency>

    当 Spring Boot 应用启动后,springdoc-openapi 会自动执行以下操作:

  • 扫描控制器:扫描所有带有 @RestController 和 @Controller 注解的类。
  • 读取路由信息:分析每个控制器类及其方法上的路由信息(如 @GetMapping、@PostMapping、@PutMapping 等)。
  • 参数和返回值:读取方法的参数和返回值,通常通过 Java 反射和相关库(如 Jackson)实现。
  • OpenAPI 注解:如果使用了 OpenAPI 相关注解(如 @Operation、@ApiResponse、@Parameter 等),也会被解析并包含在文档中。
  • 生成文档:基于收集到的信息,生成 OpenAPI 3.0 + 的描述文档

- 默认情况下,Swagger UI 可以通过 http://localhost:8080/swagger-ui.html 访问(假设应用运行在默认的8080端口)。

四、数据验证与异常处理

全局异常处理

  • 全局异常处理允许在一个集中的位置处理所有的异常,确保整体的用户体验和应用的响应行为始终如一。
  • 在 Spring Boot 中,全局异常处理通常是通过使用 @RestControllerAdvice 和 @ExceptionHandler 注解来实现的。
  • @RestControllerAdvice 是 @ControllerAdvice 的特殊变种,它默认将结果作为 JSON 返回,非常适合 RESTful 服务。
  • RestControllerAdvice 允许为多个 @RestController 类定义全局、跨切面的行为,它们不直接处理 HTTP 请求。
  • 当需要定义一些对多个控制器都适用的行为时,例如,当多个控制器都需要相同的异常处理逻辑时,@RestControllerAdvice 是最合适的选择。
  • @ExceptionHandler 用于处理控制器中的特定异常。这个注解提供了一种优雅的方式来集中处理特定的异常类型,而不是在每个控制器方法中使用 try-catch 块。

数据验证

  • Spring Boot 通过集成 Hibernate Validator 和使用 Java 的 Bean Validation API,为开发者提供了一套强大、灵活且易于使用的数据验证机制。
  • 要在 Spring Boot 应用程序中使用数据验证,首先需要添加相关的依赖,找 pom.xml 中加入以下依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
  • Java Bean Validation 提供了一系列注解,用于在 JavaBean 的字段上指定验证规则。以下是一些常见的验证注解:
    • @NotNull: 确保字段的值不为 null。
    • @Size (min=, max=): 确保字段的值的大小 / 长度在指定的范围内。
    • @Min (value=): 确保字段的值大于或等于给定的最小值。
    • @Max (value=): 确保字段的值小于或等于给定的最大值。
    • @NotBlank: 确保某个字符串属性在验证时不为空,并且其去除首尾空白后的长度至少为 1。
    • @Email: 确保字段值是电子邮件地址。
    • @Pattern (regexp=): 确保字段的值与给定的正则表达式匹配。

DTO 和 JavaBean

  • Data Transfer Object,简称 DTO,称为数据传输对象,DTO 是一个设计模式,用于在不同的系统层次或不同的系统之间传递数据。
  • 虽然 DTO 和 JavaBean 都是 POJOs(Plain Old Java Objects),但它们的目的、用途和特性可能有所不同。
    • DTO 主要用于数据传输。
    • JavaBean: 更为通用,可以用于多种目的。它们可以代表数据库的实体、UI 的模型、配置数据等。

拦截器

  • 拦截器(Interceptor)是一种设计模式,用于在某个操作或请求的前后插入特定的行为或处理逻辑。
  • 在 Web 开发中,拦截器通常用于在处理 HTTP 请求的前后执行某些操作:
    • 身份验证和授权:在请求到达目标处理器之前,进行用户身份验证和权限检查。
    • 日志记录:记录请求的详细信息,如来源 IP、请求的 URL、请求方法以及响应时间和执行时长。
    • 数据处理与监控:预加载请求所需的数据,记录请求处理时间以进行性能监控,限制

HandlerInterceptor 接口

  • 在 Spring Boot 中,拦截器是通过实现 HandlerInterceptor 接口来创建的。此接口包含三个主要方法:
    • preHandle ():请求处理之前调用。如果返回 true,请求继续进行;返回 false,请求将中断。
    • postHandle ():在请求被处理之后,但在视图被渲染之前调用。
    • afterCompletion ():请求处理完毕后调用,这包括视图的渲染。通常用于资源清理操作。

以上,就是我学习JavaSpringBoot的一些知识总结,希望会对大家有些帮助。

学习心得

接触 Spring Boot 这段时间,我收获颇丰。从最初对注解的懵懂,到熟练用 @RestController 、@RequestMapping 搭建接口,再到借 springdoc-openapi 自动生成 API 文档,开发流程越来越顺畅。全局异常处理、数据校验注解让程序更健壮,DTO 与 JavaBean 的区分,让我理解分层设计的意义。拦截器的学习,更是打开了请求管控的新视角。

Spring Boot 简化配置、拥抱约定的理念,让我明白高效开发的关键 —— 不是重复造轮子,而是善用框架、聚焦业务。每实现一个功能,都能感受到它 “开箱即用” 的魅力,也愈发懂得,技术学习既要深耕细节(如注解参数、拦截器生命周期 ),也要站在架构层面,理解分层、解耦的价值。未来,我会继续探索 Spring Boot 生态,让技术真正为业务赋能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值