Spring AOP 记录请求 Controller 中的方法

注意 @AfterReturning 和 @AfterThrowing 的用法,一个用来对返回值进行处理,
一个对异常进行处理

@Slf4j
@Aspect
@Component
public class ControllerAspect {


  @Pointcut(value = "execution(* com.magic.platform.business.*.controller..*.*(..))")
  public void controllerMethod() {}

  /**
   * 方法执行前
   * @param jp
   */
  @Before("controllerMethod()")
  public void controllerMethodBefore(JoinPoint jp) {
    try {
      String targetClassName = jp.getTarget().getClass().getName();
      String methodName = jp.getSignature().getName();
      String args = Arrays.toString(jp.getArgs());
      // 获取代理目标类自己的 logger
      Logger logger = LoggerFactory.getLogger(targetClassName);

      logger.info(">>>:{}.{}({}) begin", targetClassName, methodName, args.substring(1, args.length() - 1));
    } catch (Exception e) {
      log.error("ControllerAspect.controllerMethodBefore exception:", e);
    }

  }


  /**
   * 方法执行后
   * @param jp
   */
  @After("controllerMethod()")
  public void controllerMethodAfter(JoinPoint jp) {
    try {
      String targetClassName = jp.getTarget().getClass().getName();
      String methodName = jp.getSignature().getName();
      String args = Arrays.toString(jp.getArgs());
      // 获取代理目标类自己的 logger
      Logger logger = LoggerFactory.getLogger(targetClassName);

      logger.info(">>>:{}.{}({}) end", targetClassName, methodName, args.substring(1, args.length() - 1));
    } catch (Exception e) {
      log.error("ControllerAspect.controllerMethodAfter exception:", e);
    }

  }

  /**
   * 方法异常处理 FIXME: 注意避免与 ExceptionHandler 重复处理异常
   * @param jp
   * @param exception
   */
  @AfterThrowing(value = "controllerMethod()", throwing = "exception")
  public void controllerMethodAfterThrowing(JoinPoint jp, Throwable exception) {

    try {
      String targetClassName = jp.getTarget().getClass().getName();
      String methodName = jp.getSignature().getName();
      String args = Arrays.toString(jp.getArgs());
      // 获取代理目标类自己的 logger
      Logger logger = LoggerFactory.getLogger(targetClassName);

      logger.info(">>>:{}.{}({}) exception: {}", targetClassName, methodName, args.substring(1, args.length() - 1), exception.getMessage());
    } catch (Exception e) {
      log.error("ControllerAspect.controllerMethodAfter exception:", e);
    }
  }

  /**
   * 方法返回
   * @param joinPoint
   * @param object
   */
  @AfterReturning(value = "controllerMethod()", returning = "object")
  public void controllerMethodAfterReturning(JoinPoint joinPoint, Object object) {
    // 使用 RequestContextHolder 获取 request
    ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = requestAttributes.getRequest();

    if (object instanceof ResponseModel) {
      ((ResponseModel) object).setTimestamp(new Date());
      ((ResponseModel) object).setPath(request.getRequestURI());
    }
  }

//  @Around("controllerMethod()")
//  public void controllerMethodAround(ProceedingJoinPoint jp) {
//
//  }
}

切点的写法:切一个类中的所有的方法

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

日志注解,aop 需要引用的 jar 包

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • **** AOP 面向切面编程 底层原理 代理!!! 今天AOP课程1、 Spring 传统 AOP2、 Spri...
    luweicheng24阅读 1,523评论 0 1
  • 基本知识 其实, 接触了这么久的 AOP, 我感觉, AOP 给人难以理解的一个关键点是它的概念比较多, 而且坑爹...
    永顺阅读 8,682评论 5 114
  • title: Spring_AOP源码分析date: 2016-11-03 01:15:11categories:...
    raincoffee阅读 1,836评论 2 36
  • 在理解Spring AOP以及理清它与Aspect和cglib之间关系之前,有很多基础工作要做,比如,先对代理模式...
    maxwellyue阅读 1,557评论 0 5
  • 什么是AOP AOP(Aspect-Oriented Programming,面向切面编程),可以说是OOP(Ob...
    FX_SKY阅读 20,562评论 1 32

友情链接更多精彩内容