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

AOP计算方法执行时长的更多相关文章

  1. 【java】计算一段代码执行时长java.lang.System类里的public static long currentTimeMillis()方法

    public class Test_currentTimeMillis { public static void main(String[] args) { long start=System.cur ...

  2. C#获取程序代码执行时长

    ArrayList list = new ArrayList(); long startTicks = DateTime.Now.Ticks; for (int i = 0; i < 10000 ...

  3. 【翻译自mos文章】当并行事务恢复进程在执行时,禁用并行事务恢复的方法

    当并行事务恢复进程在执行时,禁用并行事务恢复的方法 How to Disable Parallel Transaction Recovery When Parallel Txn Recovery is ...

  4. Amazon EC2免费VPS防止超额被扣钱三大方法:流量 硬盘读写 运行时长

    Amazon EC2也就是亚马逊云服务免费VPS主机服务,内存是613MB,月流量是30GB,主机空间是30GB,可以免费使用一年,又加上Amazon服务器全球多个节点CDN和本身的名气,早在2010 ...

  5. DbCommandInterceptor抓取EF执行时的SQL语句

    EF6.1也出来不少日子了,6.1相比6.0有个很大的特点就是新增了System.Data.Entity.Infrastructure.Interception 命名空间,此命名空间下的对象可以允许我 ...

  6. html 事件处理程序中的代码在执行时,有权访问全局作用域中的任何代码。

    看一个简单的例子: html: <head> <meta charset="UTF-8"> <title>Document</title& ...

  7. 用字符串连接SQL语句并用EXEC执行时,出现名称 '‘不是有效的标识符

    原文:用字符串连接SQL语句并用EXEC执行时,出现名称 ''不是有效的标识符 用字符串连接SQL语句并用EXEC执行时,出现名称 '这里是字符串连接的一条SQL语句‘不是有效的标识符 才发现,在写e ...

  8. iOS 执行时

    一.什么是执行时(Runtime)? 执行时是苹果提供的纯C语言的开发库(执行时是开发中经经常使用到的底层技术) 二.执行时的作用? 能获得某个类的全部成员变量 能获得某个类的全部属性 能获得某个类的 ...

  9. 承载(Host)通用语言执行时

    承载(Host)通用语言执行时(CLR) 还有一种使用COM 的方法是是把须要集成的 F# 代码与已有的 C/C++ 应用程序集成到一起.开成自己定义的承载通用语言执行时.通用语言执行时就是 C++ ...

随机推荐

  1. Python灰帽子:黑客与逆向工程师的Python编程之道PDF高清完整版免费下载|百度云盘

    百度云盘免费下载:Python灰帽子:黑客与逆向工程师的Python编程之道PDF高清完整版免费下载 提取码:8nki 目录  · · · · · · 第1章 搭建开发环境 11.1 操作系统要求 1 ...

  2. js冒泡排序和数组去重

    1.冒泡排序 <script>//声明一个数组 var arr=[1,88,66,22,35,65,4,52];//自执行函数 (function maopao(){ for(var i= ...

  3. Java8线程池ThreadPoolExecutor底层原理及其源码解析

    小侃一下 日常开发中, 或许不会直接new线程或线程池, 但这些线程相关的基础或思想是非常重要的, 参考林迪效应; 就算没有直接用到, 可能间接也用到了类似的思想或原理, 例如tomcat, jett ...

  4. LRU cache缓存简单实现

    LRU cache LRU(最近最少使用)是一种常用的缓存淘汰机制.当缓存大小容量到达最大分配容量的时候,就会将缓存中最近访问最少的对象删除掉,以腾出空间给新来的数据. 实现 (1)单线程简单版本 ( ...

  5. Mysql 的数据导入导出

    一. mysqldump工具基本用法,不适用于大数据备份   1. 备份所有数据库: mysqldump -u root -p --all-databases > all_database_sq ...

  6. Python os.remove() 方法

    概述 os.remove() 方法用于删除指定路径的文件.如果指定的路径是一个目录,将抛出OSError.高佣联盟 www.cgewang.com 在Unix, Windows中有效 语法 remov ...

  7. PHP octdec() 函数

    实例 把八进制转换为十进制: <?php高佣联盟 www.cgewang.comecho octdec("36") . "<br>";echo ...

  8. PHP number_format() 函数

    实例 格式化数字: <?php高佣联盟 www.cgewang.comecho number_format("1000000")."<br>" ...

  9. PDO::query

    PDO::query — 执行 SQL 语句,返回PDOStatement对象,可以理解为结果集(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0) 说明 语法 publ ...

  10. MediaStreamConstraints对象

    MediaStreamConstraints对象作用是在调用getUserMedia()时用于指定应在返回的MediaStream中包括哪些轨道,以及(可选)为这些轨道的设置约束. 属性 audio布 ...