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
AOP计算方法执行时长的更多相关文章
- 【java】计算一段代码执行时长java.lang.System类里的public static long currentTimeMillis()方法
public class Test_currentTimeMillis { public static void main(String[] args) { long start=System.cur ...
- C#获取程序代码执行时长
ArrayList list = new ArrayList(); long startTicks = DateTime.Now.Ticks; for (int i = 0; i < 10000 ...
- 【翻译自mos文章】当并行事务恢复进程在执行时,禁用并行事务恢复的方法
当并行事务恢复进程在执行时,禁用并行事务恢复的方法 How to Disable Parallel Transaction Recovery When Parallel Txn Recovery is ...
- Amazon EC2免费VPS防止超额被扣钱三大方法:流量 硬盘读写 运行时长
Amazon EC2也就是亚马逊云服务免费VPS主机服务,内存是613MB,月流量是30GB,主机空间是30GB,可以免费使用一年,又加上Amazon服务器全球多个节点CDN和本身的名气,早在2010 ...
- DbCommandInterceptor抓取EF执行时的SQL语句
EF6.1也出来不少日子了,6.1相比6.0有个很大的特点就是新增了System.Data.Entity.Infrastructure.Interception 命名空间,此命名空间下的对象可以允许我 ...
- html 事件处理程序中的代码在执行时,有权访问全局作用域中的任何代码。
看一个简单的例子: html: <head> <meta charset="UTF-8"> <title>Document</title& ...
- 用字符串连接SQL语句并用EXEC执行时,出现名称 '‘不是有效的标识符
原文:用字符串连接SQL语句并用EXEC执行时,出现名称 ''不是有效的标识符 用字符串连接SQL语句并用EXEC执行时,出现名称 '这里是字符串连接的一条SQL语句‘不是有效的标识符 才发现,在写e ...
- iOS 执行时
一.什么是执行时(Runtime)? 执行时是苹果提供的纯C语言的开发库(执行时是开发中经经常使用到的底层技术) 二.执行时的作用? 能获得某个类的全部成员变量 能获得某个类的全部属性 能获得某个类的 ...
- 承载(Host)通用语言执行时
承载(Host)通用语言执行时(CLR) 还有一种使用COM 的方法是是把须要集成的 F# 代码与已有的 C/C++ 应用程序集成到一起.开成自己定义的承载通用语言执行时.通用语言执行时就是 C++ ...
随机推荐
- Python灰帽子:黑客与逆向工程师的Python编程之道PDF高清完整版免费下载|百度云盘
百度云盘免费下载:Python灰帽子:黑客与逆向工程师的Python编程之道PDF高清完整版免费下载 提取码:8nki 目录 · · · · · · 第1章 搭建开发环境 11.1 操作系统要求 1 ...
- js冒泡排序和数组去重
1.冒泡排序 <script>//声明一个数组 var arr=[1,88,66,22,35,65,4,52];//自执行函数 (function maopao(){ for(var i= ...
- Java8线程池ThreadPoolExecutor底层原理及其源码解析
小侃一下 日常开发中, 或许不会直接new线程或线程池, 但这些线程相关的基础或思想是非常重要的, 参考林迪效应; 就算没有直接用到, 可能间接也用到了类似的思想或原理, 例如tomcat, jett ...
- LRU cache缓存简单实现
LRU cache LRU(最近最少使用)是一种常用的缓存淘汰机制.当缓存大小容量到达最大分配容量的时候,就会将缓存中最近访问最少的对象删除掉,以腾出空间给新来的数据. 实现 (1)单线程简单版本 ( ...
- Mysql 的数据导入导出
一. mysqldump工具基本用法,不适用于大数据备份 1. 备份所有数据库: mysqldump -u root -p --all-databases > all_database_sq ...
- Python os.remove() 方法
概述 os.remove() 方法用于删除指定路径的文件.如果指定的路径是一个目录,将抛出OSError.高佣联盟 www.cgewang.com 在Unix, Windows中有效 语法 remov ...
- PHP octdec() 函数
实例 把八进制转换为十进制: <?php高佣联盟 www.cgewang.comecho octdec("36") . "<br>";echo ...
- PHP number_format() 函数
实例 格式化数字: <?php高佣联盟 www.cgewang.comecho number_format("1000000")."<br>" ...
- PDO::query
PDO::query — 执行 SQL 语句,返回PDOStatement对象,可以理解为结果集(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0) 说明 语法 publ ...
- MediaStreamConstraints对象
MediaStreamConstraints对象作用是在调用getUserMedia()时用于指定应在返回的MediaStream中包括哪些轨道,以及(可选)为这些轨道的设置约束. 属性 audio布 ...