侧边栏壁纸
博主头像
贾兴磊博主等级

读万卷书,行万里路。

  • 累计撰写 14 篇文章
  • 累计创建 21 个标签
  • 累计收到 2 条评论

通过AOP实现日志输出

贾兴磊
2022-12-13 / 0 评论 / 0 点赞 / 315 阅读 / 700 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-12-13,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

通过AOP实现日志输出

使用AOP思想添加环绕增强型日志

package com.jia.mall.order.common.interceptor;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

/**
 * 日志切面
 *  @author Jiazhibo
 */
@Aspect
@Component
@Slf4j
public class RequestLogAspect {
    //拦截web下所有方法
    @Around("execution(* com.jia.mall.*.controller.*.*(..))")
    public Object logPointcut(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        String methodName = proceedingJoinPoint.getSignature().getName();
        String classPath = proceedingJoinPoint.getSignature().getDeclaringTypeName();
        long statrTime = System.currentTimeMillis();
        Object[] args = proceedingJoinPoint.getArgs();
        if (args != null && args.length > 0) {
            log.info("\r\n请求方法:{}.{}(..)\r\n请求参数:{}", classPath, methodName, args[0]);
        } else {
            log.info("\r\n请求方法:{}.{}(..)", classPath, methodName);
        }
        Object result = proceedingJoinPoint.proceed();
        long endTime = System.currentTimeMillis();
        log.info("\r\n请求方法:{}.{}(..)\r\n响应参数:{}\r\n响应时间:{}ms", classPath, methodName, result, endTime - statrTime);
        return result;
    }
}

mybatis-plus添加sql语句输出

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

效果:

image

AOP注解

1、@Aspect

  • 名称:@Aspect

  • 类型:注解

  • 位置:类定义上方

  • 作用:设置当前类为切面类

  • 格式:

    @Aspect  
    public class AopAdvice {  
    }
    
  • 说明:一个beans标签中可以配置多个aop:config标签

2、@Pointcut

  • 名称:@Pointcut

  • 类型:注解

  • 位置:方法定义上方

  • 作用:使用当前方法名作为切入点引用名称

  • 格式:

    @Pointcut("execution(\* \*(..))")  
    public void pt() {  
    }
    
  • 说明:被修饰的方法忽略其业务功能,格式设定为无参无返回值的方法,方法体内空实现(非抽象)

3、@Before

  • 名称:@Before

  • 类型:注解

  • 位置:方法定义上方

  • 作用:标注当前方法作为前置通知

  • 格式:

    @Before("pt()")  
    public void before(){  
    }
    
  • 特殊参数:

4、@After

  • 名称:@After

  • 类型:注解

  • 位置:方法定义上方

  • 作用:标注当前方法作为后置通知

  • 格式:

    @After("pt()")  
    public void after(){  
    }
    
  • 特殊参数:

5、@AfterReturning

  • 名称:@AfterReturning

  • 类型:注解

  • 位置:方法定义上方

  • 作用:标注当前方法作为返回后通知

  • 格式:

    @AfterReturning(value="pt()",returning = "ret")  
    public void afterReturning(Object ret) {  
    }
    
  • 特殊参数:

    • returning :设定使用通知方法参数接收返回值的变量名

6、@AfterThrowing

  • 名称:@AfterThrowing

  • 类型:注解

  • 位置:方法定义上方

  • 作用:标注当前方法作为异常后通知

  • 格式:

    @AfterThrowing(value="pt()",throwing = "t")  
    public void afterThrowing(Throwable t){  
    }
    
  • 特殊参数:

    • throwing :设定使用通知方法参数接收原始方法中抛出的异常对象名

7、@Around

  • 名称:@Around

  • 类型:注解

  • 位置:方法定义上方

  • 作用:标注当前方法作为环绕通知

  • 格式:

    @Around("pt()")  
    public Object around(ProceedingJoinPoint pjp) throws Throwable {  
     Object ret = pjp.proceed();  
     return ret;  
    }
    
  • 特殊参数:

0

评论区