一. 模块简介
- annotation:自定义注解
- aop:请求日志和权限校验
- common:通用类
- config:配置类
- constant:常量
- controller:控制层
- esdao:方便操作ES
- exception:异常类
- job:定时任务、增量备份等
- manager:管理类:AI模型、GuaVa限流器
- mapper:用于复杂SQL
- model:包括DTO、VO、Domain
- service:接口和实现类,经常用于注入
- utils:工具类
- wxmp:微信工具类
- MainApplication:Spring Boot 启动类
- META-INF:SpringBoot 自动配置
- application.yml:开发环境配置
- application-prod.yml:生产环境配置
- application-test.yml:测试环境配置
- banner.txt:Spring Boot 启动 展示banner.txt中内容
二. 核心模块解析
1. 全局项目配置
application.yml
数据库配置是必须要修改的,通常改成自己的库名,用户名与密码。
如果使用到Redis,需要替换成自己的Redis数据库的密码,并移除 Spring Boot 启动类中 exclude 的内容(它用于排除 RedisAutoConfiguration 类的自动配置):
2. 全局请求、鉴权拦截器
AuthInterceptor 权限校验机制,用于判断用户的 role 是否为管理员、用户、封号三种状态:
比如创建用户方法仅为管理员使用,使用 @AuthCheck 自定义注解,并标注管理员权限即可。
在权限校验机制中,使用了 @Around 注解,即环绕通知。它允许在目标方法执行的前后都进行自定义的操作,也就是在带有 @authCheck 注解的方法执行前后进行权限校验。@Around环绕通知是AOP功能的诠释。
LogInterceptor请求日志拦截器,用于输出请求日志:
@Around 环绕通知,然后使用切入点表达式,拦截哪个包或者哪些包下面的哪个方法或者全部方法。此处拦截com.yupi.springbootinit.controller中的所有方法,也就是控制层执行方法就会打印日志进行输出。有利于异常信息的捕获和后端debug调试。
3. 通用响应类
BaseResponse、ResultUtils 和 ErroCode。
BaseResponse:通用返回类,code表示响应状态码,data存放返回的数据,message代表成功或失败的额外信息。
ResultUtils:
用于简化 BaseResponse 的操作,将成功或失败的一些通用情况进行静态方法的封装,方便调用。比如调用 success 方法,响应状态码为0,然后会将data封装到 BaseResponse 的data属性,message为"ok"。响应状态码可以自主修改。
ErrorCode:
ErrorCode配合ResultUtils使用,可以定义枚举类,将常规的响应状态码和响应信息进行封装。也可以自定义响应状态码,如API项目接口调用失败,可以定义 INTERFACE_ERROR(50003,"接口调用失败")。
4. 配置类
JsonConfig、MyBatisPlusConfig、CorsConfig、CosClientConfig、WxOpenConfig。
JsonConfig:
@JsonComponent 作用:自定义序列化和反序列化JSON数据,Spring Boot 默认使用JackSon进行序列化和反序列化。
如何防止丢失?使用 @Bean 覆盖组件后,重写逻辑代码,将包装类 Long 和基础数据类型 long 转化成字符串防止在序列化的时候丢失精度。
精度丢失场景:id在数据库是 BigInteger 类型,雪花算法生成id大于17位,因此在序列化的时候会产生精度丢失。
MyBatisPlusConfig:
@MapperScan 用于扫描指定路径,此处可以替换为自己的基础包名路径。
使用@Bean 进行组件注入,然后添加分页插件。
此外,MyBatisPlus还有很多插件,比如乐观锁插件、数据权限插件等。
CorsConfig:用于解决全局跨域配置问题,可以指定请求方法、是否允许发生 Cookie、放行哪些特定域名或ip、允许哪些请求头等。
CosClientConfig:替换accessKey、secretKey、region、bucket,在application.yml中做替换,然后配合工具类即可使用对象云存储的功能。
WxOpenConfig:在微信开放平台获取appId、appSecret等配置后,在application.yml中替换即可。
5. 全局异常处理
BusinessException、GlobalExceptionHandler和ThrowUtils。
BusinessException:
code:错误码。因为message继承了父类RunTimeException,因此就有属性message。结合ErrorCode使用。
常用第二个方法 BusinessException(ErrorCode errorCode, String message)
GlobalExceptionHandler:
@RestControllerAdvice 注解是 @ControllerAdvice 和 @ResponseBody 注解的组合,先捕获正应用程序中抛出的异常,然后将异常处理方法的返回值自动转换位HTTP响应的主体。
@ExceptionHandler 注解用于标注哪种异常需要被捕获。
ThrowUtils:
用于请求参数的校验,如果请求参数为空,直接抛出业务异常,然后指明错误码ErrorCode和message错误信息。
6. 数据库和 ES 同步
IncSyncPostToEs 和 FullSyncPostToEs
IncSyncPostToEs:
@Component 注解:取消注解后就将这个定时任务加入到Spring容器中,Spring Boot启动类启动后将开启这个定时任务。
@Scheduled 注解:Spring Boot 定时任务控制的注解。此处用于每分钟执行同步帖子的逻辑。
应用场景:
- 想要统计Top10的接口调用次数,在数据库量大后,如果每个用户去发送请求获取Top10接口调用次数,会对数据库造成巨大的请求压力。因此可以写一个定时任务,假设定时24小时,每天将Top10的接口调用次数同步到Redis缓存中,以接口名称为键、调用次数为值保存。对实时性要求不高的功能可以采用定时任务。
- 某个API接口不需要用户传参,而且大多数时间回复的调用结果都是相通的。那么可以采用定时任务,将这些接口定时同步到Redis存储,提升接口的QPS。
7. 工具类
NetUtils、SpringContextUtils、SqlUtils。
NetUtils:主要用于获取客户端 IP 地址。
SpringContextUtils:用于通过名称、类型、 名称和类型获取Spring 上下文的容器。
SqlUtils:主要用于监测SQL注入问题。