AOP与SpringBoot使用AOP实例

本文介绍了如何在SpringBoot项目中使用AOP实现操作日志记录,包括创建实体类`OperatorLog`,Mapper接口`LogMapper`,以及自定义AOP切面来捕获并记录方法调用信息,如操作人、时间、类名、方法名等。
摘要由CSDN通过智能技术生成

转载:https://blog.csdn.net/mingzq123/article/details/130226750

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for sys_log
-- ----------------------------
DROP TABLE IF EXISTS `sys_log`;
CREATE TABLE `sys_log`  (
  `id` int NOT NULL AUTO_INCREMENT,
  `create_user` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
  `create_time` datetime NOT NULL,
  `class_name` varchar(256) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
  `method_name` varchar(256) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
  `method_params` varchar(256) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
  `return_value` varchar(256) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
  `cost_time` mediumtext CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '日志信息类' ROW_FORMAT = Dynamic;
 
SET FOREIGN_KEY_CHECKS = 1;

实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class OperatorLog {
    private Integer id; //ID
    private String createUser; //操作人ID
    private LocalDateTime createTime; //操作时间
    private String className; //操作类名
    private String methodName; //操作方法名
    private String methodParams; //操作方法参数
    private String returnValue; //操作方法返回值
    private Long costTime; //操作耗时
 
    public OperatorLog(String createUser, LocalDateTime createTime, String className, String methodName, String methodParams, String returnValue, Long costTime) {
        this.createUser = createUser;
        this.createTime = createTime;
        this.className = className;
        this.methodName = methodName;
        this.methodParams = methodParams;
        this.returnValue = returnValue;
        this.costTime = costTime;
    }
}

Mapper

@Mapper
public interface LogMapper {
 
    @Insert("insert into sys_log (create_user,create_time,class_name,method_name,method_params,return_value,cost_time)" +
            "values (#{createUser},#{createTime},#{className},#{methodName},#{methodParams},#{returnValue},#{costTime});")
    void addLog(OperatorLog log);
}

自定义注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OperatorLog {
}

导入AOP的依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

自定义AOP

@Slf4j
@Configuration
@Aspect
public class CustomizationAop {
    @Autowired
    HttpServletRequest request;
 
    @Autowired
    EmpMapper empMapper;
 
    @Autowired
    LogMapper logMapper;
 
    @Around("@annotation(com.huang.anno.OperatorLog)")
    public Object around(ProceedingJoinPoint p) throws Throwable{
        //获取token
        String token = request.getHeader("token");
        Claims claims = JwtUtils.parseJwt(token);
        //获取操作人名字
        Integer id = (Integer) claims.get("id");
        String operatorName = empMapper.getOneById(id).getName();
        //获取现在时间
        LocalDateTime now = LocalDateTime.now();
        //获取类名
        String className = p.getTarget().getClass().getName();
        //获取方法名
        String methodName = p.getSignature().getName();
        //获取参数名
        Object[] args = p.getArgs();
        String params = Arrays.toString(args);
        //方法执行前时间
        long begin = System.currentTimeMillis();
        //方法执行
        Object result = p.proceed();
        //方法执行后时间
        long end = System.currentTimeMillis();
        //获取执行时间
        long costTime = end - begin;
        //方法返回值
        String returnValue = JSONObject.toJSONString(result);
        if (returnValue.length()>255) {
            returnValue = returnValue.substring(0, 255);
        }
 
        OperatorLog operatorLog = new OperatorLog(operatorName, now, className, methodName, params, returnValue, costTime);
        logMapper.addLog(operatorLog);
 
        log.info("日志记录:{}",operatorLog);
        return result;
    }
}

实现

@GetMapping
@OperatorLog
public Result page(@RequestParam(required = false) String name,
                   @RequestParam(required = false) Short gender,
                   @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
                   @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end,
                   @RequestParam(defaultValue = "1") Integer page,
                   @RequestParam(defaultValue = "10") Integer pageSize){
    PageBean pageBean = empService.page(name,gender,begin,end,page,pageSize);
    return Result.success(pageBean);
}

测试

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值