Aop处理操作记录

记录操作日志,主要是可以记录下做了哪些事情,有问题再优化

1:添加一个注解类

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


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

    String category() default "";

    String type() default "";

    String description() default "";
}

2:在方法上声明注解,description 可以使用model对象

    @OperationAnnotation(category = "资料管理", type = "资料删除", description = "删除: + #{document.title} + 作者: + #{document.creatorName}")

3:切面方法


import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.ArrayUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.lang.reflect.Method;


@Slf4j
@Component
@Aspect
public class OperationAspect {


    @Pointcut(value = "@annotation(OperationAnnotation)")
    void operation() {

    }

	// 方法执行完毕之后记录
    @After("operation()")
    public void afterOperation(JoinPoint joinPoint) {

        MethodSignature signature = (MethodSignature) joinPoint.getSignature();

        OperationAnnotation operationAnnotation = signature.getMethod().getAnnotation(OperationAnnotation.class);

        String category = operationAnnotation.category();

        String type = operationAnnotation.type();

        String description = getDescription(joinPoint, operationAnnotation.description());

        System.out.printf("%s  %s  %s%n", category, type, description);

		// 插入数据库  insert
    }


    private String getDescription(JoinPoint joinPoint, String spelStr) {

        Object[] args = joinPoint.getArgs();

        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();

        //获取被拦截方法参数名列表(使用Spring支持类库)
        LocalVariableTableParameterNameDiscoverer localVariableTable = new LocalVariableTableParameterNameDiscoverer();

        String[] paraNames = localVariableTable.getParameterNames(method);

        if (ArrayUtils.isEmpty(paraNames)) {

            return "";
        }

        //使用SPEL进行key的解析
        ExpressionParser parser = new SpelExpressionParser();

        //SPEL上下文
        StandardEvaluationContext context = new StandardEvaluationContext();

        //把方法参数放入SPEL上下文中
        for (int i = 0; i < paraNames.length; i++) {

            context.setVariable(paraNames[i], args[i]);
        }

        StringBuilder stringBuilder = new StringBuilder();

        String split = "\\+";

        for (String s : spelStr.split(split)) {

            if (s.contains("#{")) {

                s = s.replace("{", "").replace("}", "").trim();

                s = parser.parseExpression(s).getValue(context, String.class);
            }

            stringBuilder.append(s);
        }

        return stringBuilder.toString();
    }

}

SPEL表达式参考:https://www.liangzl.com/get-article-detail-194743.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值