zoukankan      html  css  js  c++  java
  • spring aop 记录 service 方法调用时长

    添加依赖

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

    编写 ServiceLogAspect.java

    新建 ServiceLogAspect.java 文件,然后输入以下内容:

    package cn.myesn.aspect;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    @Aspect
    @Component
    public class ServiceLogAspect {
        private static final Logger log = LoggerFactory.getLogger(ServiceLogAspect.class);
    
        /**
         * AOP 通知:
         * 1. 前置通知:在方法调用之前执行
         * 2. 后置通知:在方法正常调用之后执行(不能抛出异常)
         * 3. 环绕通知:在方法调用之前和之后,都分别可以执行的通知
         * 4. 异常通知:如果在方法调用过程中发生异常,则通知
         * 5. 最终通知:在方法调用之后执行(相当于 try-catch-finally 中的 finally)
         */
    
    
        /**
         * @Around 环绕通知
         *
         * 记录 service 方法执行时间,根据不同时间输出不同的日志级别
         *
         *  切面表达式:
         *      execution 代表所要执行的表达式主题
         *          第一处 * 代表方法返回类型,* 代表所有类型
         *          第二处包名 cn.myesn.service.impl 代表 aop 监控的类所在的包
         *          第三处 .. 代表该包及其子包下的所有类方法
         *          第四处 * 代表类名,* 代表所有类
         *          第五处 *(..),* 代表类中的方法名,* 表示所有方法,(..) 表示方法中的任何参数
         *
         * @param joinPoint
         * @return
         * @throws Throwable
         */
        @Around("execution(* cn.myesn.service.impl..*.*(..))")
        public Object recordTimeLog(ProceedingJoinPoint joinPoint) throws Throwable {
            log.info("----- 开始执行 {}.{}-----",
                    joinPoint.getTarget().getClass(),
                    joinPoint.getSignature().getName());
    
            // 记录开始时间
            final long begin = System.currentTimeMillis();
    
            // 执行目标 service
            final Object result = joinPoint.proceed();
    
            // 记录结束时间
            final long end = System.currentTimeMillis();
            final long takeTime = end - begin;
            if (takeTime > 3000) {
                log.error("----- 执行结束,耗时:{} 毫秒 -----", takeTime);
            } else if (takeTime > 2000) {
                log.warn("----- 执行结束,耗时:{} 毫秒 -----", takeTime);
            } else {
                log.info("----- 执行结束,耗时:{} 毫秒 -----", takeTime);
            }
    
            return result;
        }
    }
    
  • 相关阅读:
    part11-1 Python图形界面编程(Python GUI库介绍、Tkinter 组件介绍、布局管理器、事件处理)
    part10-3 Python常见模块(正则表达式)
    Cyclic Nacklace HDU
    模拟题 Right turn SCU
    状态DP Doing Homework HDU
    Dp Milking Time POJ
    区间DP Treats for the Cows POJ
    DP Help Jimmy POJ
    Dales and Hills Gym
    Kids and Prizes Gym
  • 原文地址:https://www.cnblogs.com/myesn/p/15499568.html
Copyright © 2011-2022 走看看