SpringBoot下使用AOP做日志


AOP实现接口执行时间的计算:

  • SpringBoot项目导入spring-boot-starter-aop依赖
  • 编写切面类
    • 类上加@Aspect注解,表明这是一个切面类
    • 类上加@Component,把切面交给Spring管理(我们要切的Controller/Service都是Spring容器的,切面要对它们起作用,就必须同样进入容器)
    • 类内部配置切点表达式,比如@Pointcut("execution(* com.bravo.demo.controller.*.*(..))") 表示对com.bravo.demo.controller包下所有方法进行增强
    • 类内部编写增强逻辑,通常使用@Before、@Around声明这是一个增强,不同的注解增强的方式不同,比如@Before前置增强、@Around环绕增强

1、导入AOP整合SpringBoot依赖

 
 
     org.springframework.boot
     spring-boot-starter-aop
 

2、编写切面类:com.zhixi.config.aop.ApiTimeLogAspect

import lombok.extern.slf4j.Slf4j;
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.springframework.stereotype.Component;

/**
 * @ClassName ApiTimeLogAspect
 * @Author zhangzhixi
 * @Description
 * @Date 2022-4-15 10:42
 * @Version 1.0
 */
@Slf4j
/*第一步:声明这是一个切面类*/
@Aspect
@Component
public class ApiTimeLogAspect {

    /**
     * 第二步:定义切点表达式,明确要对那些方法起作用(比如,只对com.bravo.demo.controller包的方法计算接口耗时)
     */
    @Pointcut("execution(* com.zhixi.controller.*.*(..))")
    public void controllerPointcut() {
    }

    /**
     * 第三步:1.通过引用切点表达式,明确这个增强的应用规则。 2.编写增强逻辑
     *
     * @param proceedingJoinPoint 执行目标方法的参数
     * @return 返回目标方法的执行结果
     * @throws Throwable proceedingJoinPoint.proceed()方法抛出的异常
     */
    @Around(value = "controllerPointcut()")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        // 记录接口执行前的时间戳
        long startTime = System.currentTimeMillis();
        // 实际执行目标方法,类似动态代理的invoke()执行目标方法
        Object result = proceedingJoinPoint.proceed();
        // 计算接口耗时
        log.info("------------ 耗时: {} ms ------------", System.currentTimeMillis() - startTime);
        // 只做增强不做改变,还是要把接口原本的结果返回
        return result;
    }
}

3、启动项目访问接口即可