问题

在项目中,想记录用户的日志,如果每个方法都写一遍记录日志入库操作,那么代码肯定不优雅,我们可以通过AOP去记录日志入库操作,只需写一遍代码,通过自定义注解形式去识别哪些需要记录的日志!

Maven导包

<dependencies>
    <!--spring核心依赖,会将spring-aop传递进来-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
    <!--切入点表达式依赖,目的是找到切入点方法,也就是找到要增强的方法-->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
    </dependency>
</dependencies>

AOP记录日志注解代码

/**
 * AOP记录日志
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogAop {
    String code() default "";
}

使用方式

在方法上声明注解 @LogAop(code = "USER_PWD_LOGIN")

AOP记录日志功能实现

    /**
     * 切入点表达式
     */
    @Pointcut("execution(* cn.jufb.user.service.*.*(..))")
    private void pt() {
    }

    /**
     * 记录日志
     *
     * @param pjp
     * @return
     * @throws Throwable
     */
    @Around("pt()")
    public Object recordLog(ProceedingJoinPoint pjp) throws Throwable {
        //方法返回结果
        Object resultData = pjp.proceed();

        //获取LogAop注解中的 日志类型编码
        MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
        Method method = methodSignature.getMethod();
        LogAop logAop = method.getAnnotation(LogAop.class);
        if (null == logAop || StringUtils.isBlank(logAop.code())) {
            return resultData;
        }

        String logType = logAop.code();

        //...
   }

效果

aop记录日志-演示效果

处理方案

此时我们已经拿到了,我们自定义的注解值,以上图为例: 此时拿到了USER_PWD_LOGIN这个值,我们可以进行入库或其他操作,如果想转译成中文或者是还想在库中记录详细信息,我们可以通过枚举,通过我们传过来的值进行获取其他信息等

最后修改:2022 年 10 月 08 日
如果觉得我的文章对你有用,请随意赞赏