JGYBZX_G 2022-04-28 17:02 采纳率: 66.7%
浏览 58
已结题

springboot 利用 切面计算方法的时间,为什么有的方法没有执行这个切面

利用注解的方式编写 了一个计算方法执行时间的切面,我把注解放在了controller层的方法上和一个自定义的方法上,但是发现自定义方法没有执行这个切面。
第一个方法为一个controller,第二个方法为这个controller方法里边调用的另一个方法
最后的日志只打印了 第一个方法的执行时间,

img

img

img

注解

package com.bjidit.eccms.common.aop;

import java.lang.annotation.*;

/**
 * @author Jgybz
 * @date 2022/4/28/0028 15:54
 * @des
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MethodRunTime {

}


切面

package com.bjidit.eccms.common.aop;

import com.bjidit.eccms.common.exception.BusinessException;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * @author Jgybz
 * @date 2022/4/28/0028 15:56
 * @des
 */
@Aspect
@Component
public class MethodRunTimeAspect {
    private final Logger log = LoggerFactory.getLogger(this.getClass());

    /**
     * 切点 扫描整个mapper
     */
    @Pointcut("@annotation(com.bjidit.eccms.common.aop.MethodRunTime)")
    public void runTime() {
        // 定义
    }

    @Before("runTime()")
    public void before(JoinPoint joinPoint) {
        String name = joinPoint.getSignature().getName();
    }

    @After("runTime()")
    public void after(JoinPoint joinPoint) {
        String name = joinPoint.getSignature().getName();
    }

    @AfterReturning(value = "runTime()", returning = "result")
    public void afterReturning(JoinPoint joinPoint, Object result) {
        String name = joinPoint.getSignature().getName();
    }

    @Around("runTime()")
    public Object around(ProceedingJoinPoint pjp) {

        try {
            String name = pjp.getSignature().getName();
            Class declaringType = pjp.getSignature().getDeclaringType();
            String declaringTypeName = pjp.getSignature().getDeclaringTypeName();
            int modifiers = pjp.getSignature().getModifiers();
            long startTime = System.currentTimeMillis();
            Object result = pjp.proceed();
            long endTime = System.currentTimeMillis();
            long time = endTime - startTime;
            log.info("Method name [{}] ----->执行时间:{}", declaringTypeName + "." + name, time);
            return result;
        } catch (Throwable th) {
            th.printStackTrace();
            throw new BusinessException(500, th.getMessage());
        }
    }
}


  • 写回答

1条回答 默认 最新

报告相同问题?

问题事件

  • 系统已结题 5月6日
  • 创建了问题 4月28日

悬赏问题

  • ¥15 c++ gmssl sm2验签demo
  • ¥15 关于模的完全剩余系(关键词-数学方法)
  • ¥15 有没有人懂这个博图程序怎么写,还要跟SFB连接,真的不会,求帮助
  • ¥30 模拟电路 logisim
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?