自定义注解AOP应用

本文介绍了如何在APIJson项目中利用AOP技术实现方法级别的日志跟踪,通过定义注解并结合AspectJ实现对特定方法的环绕通知,记录配置标识、操作标识以及入参和执行结果。
摘要由CSDN通过智能技术生成

前言

结合公司最近的需求,需要对一些配置进行日志跟踪,经过思考后发现这个场景非常适合AOP的应用,于是有了这一篇实战记录,话不多说直接开干。

定义注解

package com.linksame.iot.apijson.configuration.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @Author Ivan
 * @Date 2023/11/30 16:06
 * @Description
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Record {

    /**
     * 配置标识
     */
    String config() default "";

    /**
     * 操作标识
     */
    String operation() default "";
}

注解实现

package com.linksame.iot.apijson.configuration.aspect;

import com.alibaba.fastjson.JSON;
import com.linksame.iot.apijson.configuration.annotation.Record;
import com.linksame.iot.apijson.configuration.params.ServerParams;
import com.linksame.iot.apijson.configuration.service.RecordService;
import com.linksame.iot.common.core.util.R;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * @Author Ivan
 * @Date 2023/11/30 16:03
 * @Description
 */
@Slf4j
@Aspect
@Component
@AllArgsConstructor
public class RecordAspect {

    private final RecordService recordService;

    //@Record标识为切入点,切面会根据@Record注解来注入数据
    @Pointcut("@annotation(com.linksame.iot.apijson.configuration.annotation.Record)")
    public void logPointCut(){}

    //环绕注入
    @Around("logPointCut()")
    public R around(ProceedingJoinPoint point) throws Throwable {
        Object result = point.proceed();//执行目标方法

        //日志信息记录
        MethodSignature methodSignature = (MethodSignature) point.getSignature();
        Method method = methodSignature.getMethod();
        Record record = method.getDeclaredAnnotation(Record.class);
//        String className = point.getTarget().getClass().getName();//类名
//        String methodName = method.getName();//方法名

        //入参信息
        Object[] args = point.getArgs();
        ServerParams params = JSON.parseObject(JSON.toJSONString(args[0]), ServerParams.class);
        log.info("入参信息: {}", params);
        log.info("配置标识: {}", record.config());
        log.info("操作标识: {}", record.operation());
        log.info("执行结果: {}", result);

        R r = JSON.parseObject(JSON.toJSONString(result), R.class);
        if(r.getCode() == 0){
            //权限基础配置
            com.linksame.iot.apijson.configuration.entity.Record recordData = new com.linksame.iot.apijson.configuration.entity.Record();
            String serverName = "system", serverReadme = "系统后台", createBy = "超级管理员";
            recordData.setConfigFlag(record.config());
            recordData.setOperationFlag(record.operation());

            if(StringUtils.isNotBlank(params.getServerName())){
                serverName = params.getServerName();
            }
            if(StringUtils.isNotBlank(params.getServerName())){
                serverReadme = params.getServerReadme();
            }
            if(StringUtils.isNotBlank(params.getCreateBy())){
                createBy = params.getCreateBy();
            }
            recordData.setServerName(serverName);
            recordData.setServerReadme(serverReadme);
            recordData.setCreateBy(createBy);

            //method
            if(record.config().equalsIgnoreCase("Access")){
                recordData.setMethodFlag("查询");
            }
            if(record.config().equalsIgnoreCase("Request")){
                if(params.getMethod().equalsIgnoreCase("POST")){
                    recordData.setMethodFlag("新增");
                }
                if(params.getMethod().equalsIgnoreCase("PUT")){
                    recordData.setMethodFlag("修改");
                }
                if(params.getMethod().equalsIgnoreCase("DELETE")){
                    recordData.setMethodFlag("删除");
                }
            }

            //configId
            if(record.operation().equals("注册")){
                recordData.setConfigId(r.getData().toString());
            }
            if(record.operation().equals("更新") || record.operation().equals("删除")){
                recordData.setConfigId(params.getId());
            }

            recordService.save(recordData);
        }

        return r;
    }
}

注解应用

/**
     * 创建
     * @param accessParams
     * @return
     */
    @Record(config = "Access", operation = "注册")
    @PostMapping
    public R save(@RequestBody AccessParams accessParams){
        return accessService.saveAccess(accessParams);
    }

效果

image.png

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值