• AOP计算方法执行时长


    AOP计算方法执行时长

    依赖引入

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

    注意:在完成了引入AOP依赖包后,不需要去做其他配置。AOP的默认配置属性中,spring.aop.auto属性默认是开启的,也就是说只要引入了AOP依赖后,默认已经增加了@EnableAspectJAutoProxy,不需要在程序主类中增加@EnableAspectJAutoProxy来启用。

    如果需要关闭,在 application.properties 中加入配置

    spring.aop.auto=false
    

    切面编写

    package com.cc.analysis;
    
    //AOP切面 :多个切面时,@Order(i)注解来标识切面的优先级。i的值越小,优先级越高
    @Aspect
    @Slf4j
    @Component
    public class ExeTimeAspect {
    
        @Pointcut("execution(public * com.cc.analysis.controller.AnalysisController.*(..))")
        public void logTime(){}
    
        //统计请求的处理时间
        ThreadLocal<Long> startTime = new ThreadLocal<>();
    
        @Before("logTime()")
        public void doBefore(JoinPoint joinPoint) throws Throwable{
            startTime.set(System.currentTimeMillis());
            //接收到请求,记录请求内容
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
            //记录请求的内容
            log.info("Aspect_URL:"+request.getRequestURL().toString());
            log.info("Aspect_Method:"+request.getMethod());
        }
    
        @AfterReturning(returning = "ret" , pointcut = "logTime()")
        public void doAfterReturning(Object ret){
            //处理完请求后,返回内容
            log.info("方法返回值:"+ JSON.toJSONString(ret));
            log.info(String.format("方法执行时间: %d 毫秒", System.currentTimeMillis() - startTime.get()));
        }
    }
    

    controller方法执行

    @GetMapping("test")
    public int test() {
        return 1;
    }
    

    执行结果

    2020-07-27 12:36:00.088  INFO 7457 --- [nio-9090-exec-2] c.c.analysis.ExeTimeAspect    : Aspect_URL:http://localhost:9090/test
    2020-07-27 12:36:00.089  INFO 7457 --- [nio-9090-exec-2] c.c.analysis.ExeTimeAspect    : Aspect_Method:GET
    2020-07-27 12:36:00.093  INFO 7457 --- [nio-9090-exec-2] c.c.analysis.ExeTimeAspect    : 方法返回值:1
    2020-07-27 12:36:00.093  INFO 7457 --- [nio-9090-exec-2] c.c.analysis.ExeTimeAspect    : 方法执行时间: 5 毫秒
    

    疑问

    springboot的启动类和AOP的配置类(ExeTimeAspect)需要在同一级目录下,才能够扫描到controller里的方法,执行AOP的效果。如果AOP的配置类(ExeTimeAspect)在子目录则无法执行。

    尝试在启动类增加注解 @ComponentScan("com.cc.analysis.*") 也没能解决问题

    成功执行目录

    |____com
    | |____cc
    | | |____analysis
    | | | |____App.java*
    | | | |____ExeTimeAspect.java*
    | | | |____controller
    | | | | |____AnalysisController.java
    

    失败目录

    |____com
    | |____cc
    | | |____analysis
    | | | |____App.java*
    | | | |____config
    | | | | |____ExeTimeAspect.java*
    | | | |____controller
    | | | | |____AnalysisController.java
    
  • 相关阅读:
    Java获取输入
    [转载]Eclipse快捷键 10个最有用的快捷键
    运算符优先级
    Error:Cannot build artifact 'seckill:war' because it is included into a circular dependency (artifact 'seckill:war', artifact 'seckill:war exploded')
    spring boot 扫描不到controller情形一
    注解控制事物方法
    <转载>标签接口
    生成二维码(QRcode(for java version)生成二维码)
    Linux 常见命令
    【C#】File.WriteAllText 类的使用(实现自定义日志记录)
  • 原文地址:https://www.cnblogs.com/renzhuo/p/13522835.html
Copyright © 2020-2023  润新知