SpringBoot自定义注解+异步+观察者模式实现业务日志保存

一、前言我们在企业级的开发中,必不可少的是对日志的记录,实现有很多种方式,常见的就是基于AOP+注解进行保存,但是考虑到程序的流畅和效率,我们可以使用异步进行保存,小编最近在spring和springboot源码中看到有很多的监听处理贯穿前后:这就是著名的观察者模式?。?
二、基础环境项目这里小编就不带大家创建了,直接开始?。?
1. 导入依赖小编这里的springboot版本是:2.7.4
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.2</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.16</version></dependency><!--jdbc--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- mysql --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- mybatis-plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency>2. 编写yml配置server:port: 8088spring:datasource:#使用阿里的Druidtype: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.239.131:3306/test?serverTimezone=UTCusername: rootpassword: root三、数据库设计数据库保存日志表的设计,小编一切从简,一般日志多的后期会进行分库分表 , 或者搭配ELK进行分析,分库分表一般采用根据方法类型,这需要开发人员遵循rest风格,不然肯定都是post,纯属个人见解哈?。〈蠹铱梢愿葑约旱墓镜囊蠼胁钩涔 。?
DROP TABLE IF EXISTS `sys_log`;CREATE TABLE `sys_log`(`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '日志主键',`title` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '模块标题',`business_type` int(2) NULL DEFAULT 0 COMMENT '业务类型(0其它 1新增 2修改 3删除)',`method` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '方法名称',`request_method` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '请求方式',`oper_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '操作人员',`oper_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '请求URL',`oper_ip` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '主机地址',`oper_time` datetime(0) NULL DEFAULT NULL COMMENT '操作时间',PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 1585197503834284034 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '操作日志记录' ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;实体类:
import com.baomidou.mybatisplus.annotation.TableId;import com.baomidou.mybatisplus.annotation.TableName;import com.fasterxml.jackson.annotation.JsonFormat;import lombok.Data;import java.time.LocalDateTime;/** * 操作日志记录表 sys_log * */@Data@TableName("sys_log")public class SysLog {private static final long serialVersionUID = 1L;/*** 日志主键*/@TableIdprivate Long id;/*** 操作模块*/private String title;/*** 业务类型(0其它 1新增 2修改 3删除)*/private Integer businessType;/*** 请求方式*/private String requestMethod;/*** 操作人员*/private String operName;/*** 请求url*/private String operUrl;/*** 操作地址*/private String operIp;/*** 操作时间*/@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime operTime;}四、主要功能大体思路:先手写一个注解--->切面来进行获取要保存的数据--->一个发布者来发布要保存的数据--->一个监听者监听后保存(异步)
完整项目架构图如下:

SpringBoot自定义注解+异步+观察者模式实现业务日志保存

文章插图
1. 编写注解import com.example.demo.constant.BusinessTypeEnum;import java.lang.annotation.*;/** * 自定义操作日志记录注解 * @author wangzhenjun * @date 2022/10/26 15:37 */@Target(ElementType.METHOD) // 注解只能用于方法@Retention(RetentionPolicy.RUNTIME) // 修饰注解的生命周期@Documentedpublic @interface Log {String value() default "";/*** 模块*/String title() default "测试模块";/*** 功能*/BusinessTypeEnum businessType() default BusinessTypeEnum.OTHER;}

推荐阅读