likes
comments
collection
share

SpringBoot项目开发技巧实践

作者站长头像
站长
· 阅读数 3

胡马依北风,越鸟巢南枝。

1 前言

前文已经介绍了一些 SpringBoot 的开发技巧,在本文中将继续讲解一些关于项目开发的知识点,对这些知识点进行总结,作为一个成熟稳定的业务模块,在开发其它项目时可以无缝衔接,直接利用现成的技术模块,对于提高开发效率会有帮助,这也是写开源项目集成各种工具和代码的原因。在本文中将分享异常处理、分布式锁、拦截器和过滤器的配置。

2 异常处理

异常处理是在项目开发中十分常见的操作,对于提高系统的稳定性和容错性有很大的帮助,通常异常的处理分为页面请求异常和 ajax 请求异常,针对这两种方式,分别采用以下两种方式处理:

// 处理页面请求异常
@ControllerAdvice
// 处理 ajax 异常,该其实就是 @ControllerAdvice + @ResponseBody
@ResetControllerAdvice
// 添加拦截的异常信息,@ResponseStatus 响应码码可以指定,也可以不指定
@ExceptionHandler(DuplicateKeyException.class)
@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
public void someMethod(DuplicateKeyException ex){}

每个异常处理器里面可以定义多个异常,在处理异常信息时,会匹配到对应的异常进行处理。值得注意的是,处理页面异常时,返回的是一个错误页面,可以把错误信息显示在错误页面上,也可以定义不同的错误页面进行展示。对于 ajax 请求异常,通常是对返回结果进行包装,返回对应的错误信息字段加上对应的响应码即可。

SpringBoot项目开发技巧实践

3 拦截器和过滤器

拦截器和过滤器在开发中通常起到鉴权和日志记录的作用,一些非业务但是项目需要的逻辑处理需要在拦截器或者过滤器中进行。具体拦截时,过滤器发生在拦截器之前。

关于过滤器和拦截器的配置如下图所示:

SpringBoot项目开发技巧实践

其中拦截器通常会拦截请求并添加请求头信息,用于标记请求进行链路追踪使用,同时也可以记录请求日志和返回结果日志。对于过滤器,通常是处理请求参数使用,如上图所示,可以转换请求头,进行 token 信息的处理。

4 分布式锁

分布式锁在分布式开发中的使用非常实用,通常是使用自定义注解来实现添加锁的位置信息,这个分布式锁利用了 AOP 的思想来实现,实现了分布式锁和业务的解耦,在开发中具有重大的实用价值。分布式锁的实现一般使用 redisson 来实现,因为其获取锁的同时能添加看门狗,以便在业务执行时间超时时添加锁的过期时间,防止锁被别的业务线程抢走从而导致并发问题的出现。

首先我们需要定义分布式锁的注解,根据需要传入关于锁的信息,同时在切面中获取分布式锁的信息,进行业务处理,改分布式锁支持 spring el 表达式,可谓是功能强大。

SpringBoot项目开发技巧实践

此外,我们需要声明 redisson 的链接以及操作 redisson 的工具类:

SpringBoot项目开发技巧实践

5 feign 调用添加请求头

在分布式开发中,在一些特定的情况下,需要在请求头添加一些参数,或者是 traceId 用来标记一些请求。那么如何添加呢,对于都是 openfeign 调用的方法来说,可以添加一个拦截器来实现对所有的服务实现请求头的内容添加。

SpringBoot项目开发技巧实践

6 mybatis-plus 字段填充

在我们做业务开发的过程中,需要记录数据的创建时间和更新时间,如果没有再数据库设置对应的变更时,就需要在代码中编写对应的更新或者新增字段,这样会导致很多重复的代码,导致代码的臃肿和重复。在使用 mybatis-plus 作为 orm 框架的应用中,可以使用 MetaObjectHandler 来处理字段的填充,这里需要说明的是,需要区分字段填充的逻辑,这里以创建时间和更新时间为例,更新数据只需要修改更新时间,创建时两个字段都需要填充。

@TableField(value = "create_time", fill = FieldFill.INSERT)
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)

重写 MetaObjectHandler 的逻辑如下图所示:

SpringBoot项目开发技巧实践

6 总结

在本文中,讲述了 SpringBoot 项目开发过程中的技巧,主要涉及异常处理、分布式锁、 feign 调用、字段填充、拦截器和过滤器等内容,在后续项目开发中作为成熟的技术模块可以方便使用。本文中所涉及的代码已经上传至 github, 欢迎交流学习。项目地址 springboot-auth