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编程之道|百度网盘免费下载|新手黑客入门
百度网盘免费下载:Python灰帽子:黑客与逆向工程师的Python编程之道 提取码:tgpg 目录 · · · · · · 第1章 搭建开发环境 11.1 操作系统要求 11.2 获取和安装Pyt ...
- Python os.fsync() 方法
概述 os.fsync() 方法强制将文件描述符为fd的文件写入硬盘.在Unix, 将调用fsync()函数;在Windows, 调用 _commit()函数.高佣联盟 www.cgewang.com ...
- PHP strrev() 函数
实例 反转字符串 "Hello World!": <?php高佣联盟 www.cgewang.comecho strrev("Hello World!") ...
- Ynoi专练
为了练习分块 莫队 bitset黑科技 我会写几道Ynoi 放到这里. bitset 每一位占1bit int 每一位占 4 bitye bool占1 bitye long long 8bitye L ...
- 每日一道 LeetCode (5):最长公共前缀
前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee: https://gitee.com ...
- explain关键字使用解释
原文: 58沈剑 架构师之路 https://mp.weixin.qq.com/s/oWNrLHwqM-0ObuYbuGj98A <数据库允许空值,往往是悲剧的开始>一文通过explai ...
- GLIBC_2.18 not found 之类的问题解决办法
先到 /usr/lib64 下 ll libstdc++* 会发现 libstdc++.so.6 指向了一个新的.比如我这里之前指向6.0.22这个版本,报错 此时只要重新建立软连接 将软连接指向旧的 ...
- 2017面向对象程序设计(Java)第十七周助教工作总结
本学期已接近尾声,java课程也即将结束.经过一学期的java学习,相信大家已经从最初的懵懂.困惑渐渐的走向了柳暗花明,并对java的体系结构有了更加清晰的认识.但一学期的学习是远远不 ...
- Ubuntu16.04忘记用户登录密码以及管理员密码,重置密码的解决方案
1. 问题现象: 密码遗忘 2. 问题原因 问题原因,搞不懂,只是修改了/etc/shadow和/etc/sudoers这俩文件 3. 解决方案 在系统开机前常按shift键进入grub界面,如下: ...
- 8道python练习题,能做出来的没几个
变量的定义 程序就是用来处理数据的,而变量就是用来存储数据的 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道 ...