个人技术分享

  1. 创建一个自定义注解

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MeasureExecutionTime {
    }
    
  2. 创建一个切面类,用于统计方法执行时间

    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.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    @Aspect
    @Component
    public class MethodExecutionTimeAspect {
    
        private static final Logger logger = LoggerFactory.getLogger(MethodExecutionTimeAspect.class);
    
        @Pointcut("@annotation(com.example.demo.annotation.MeasureExecutionTime)")
        public void measureExecutionTimeMethods() {
        }
    
        @Around("measureExecutionTimeMethods()")
        public Object measureExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
            long startTime = System.currentTimeMillis();
            Object result = joinPoint.proceed();
            long endTime = System.currentTimeMillis();
            long executionTime = endTime - startTime;
            logger.info("{} executed in {} ms", joinPoint.getSignature(), executionTime);
            return result;
        }
    }
    

    注意:
    这种方法仅适用于使用@MeasureExecutionTime注解的方法。在生产环境中,建议关闭方法执行时间统计功能,以免影响系统性能。

    可以将切面类的实例化代码注释掉,或者在application.properties中添加以下配置:

    logging.level.com.example.demo.aspect.MethodExecutionTimeAspect=OFF
    
  3. 统计其他方法的执行时间

    @MeasureExecutionTime
    public void someMethod() {
        // ...
    }
    

    这样,每次执行someMethod()方法时,都会输出执行时间