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 Java与Hbase相关问题
  • ¥20 bash代码推送不上去 git fetch origin master #失败了
  • ¥15 LOL外服加入了反作弊系统,现在游戏录像rofl文件离线都无法打开
  • ¥15 在centos7安装conda
  • ¥15 c#调用yolo3 dll文件获取的数据对不上
  • ¥20 WPF 如何实现多语言,label 和cs(live Charts)中是否都能翻译
  • ¥15 STM32F103上电短路问题
  • ¥15 打开软件提示错误:failed to get wglChoosePixelFormatARB
  • ¥15 (标签-python|关键词-char)
  • ¥15 python+selenium,在新增时弹出了一个输入框